1/** 2 * ÐбÑий глобалÑнÑй коÑневой JS-обÑÐµÐºÑ ÑÐµÐ¼Ñ Ð¾ÑоÑÐ¼Ð»ÐµÐ½Ð¸Ñ ReadyScript. 3 * ÐавиÑÐ¸Ñ Ð¾Ñ corelang.js 4 */ 5window.RsJsCore = { 6 /** 7 * ÐдеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ ÑаниÑÑ Ð»ÑбÑе пеÑеменнÑе, Ñ Ð°ÑакÑеÑизÑÑÑие ÑекÑÑее ÑоÑÑоÑние ÑÑÑаниÑÑ. 8 * ÐÑо обÑÐ°Ñ Ð³Ð»Ð¾Ð±Ð°Ð»ÑÐ½Ð°Ñ Ð¿ÐµÑÐµÐ¼ÐµÐ½Ð½Ð°Ñ Ð¼ÐµÐ¶Ð´Ñ Ð²Ñеми плагинами и компоненÑами. ÐапÑимеÑ, здеÑÑ Ð¼Ð¾Ð¶Ð½Ð¾ Ñ ÑаниÑÑ Ñлаг о Ñом, ÑÑо 9 * ÑейÑÐ°Ñ Ð½Ð° ÑайÑе Ð¸Ð´ÐµÑ Ð·Ð°Ð³ÑÑзка Ñего-Ñо и оÑобÑажен overlay, знаÑÐ¸Ñ Ð½Ñжно пÑиоÑÑановиÑÑ Ð´ÑÑгие дейÑÑвиÑ, 10 * коÑоÑÑе могÑÑ Ð²ÑзваÑÑ ÐºÐ¾Ð½ÑликÑ, напÑÐ¸Ð¼ÐµÑ Ð¿Ð¾Ð²ÑоÑное вÑполнение аналогиÑного дейÑÑвиÑ. 11 */ 12 state: {}, 13 14 /** 15 * ÐдеÑÑ ÑазмеÑаÑÑÑÑ Ð»ÑбÑе полезнÑе ÑÑаÑиÑеÑкие ÑÑнкÑии обÑего назнаÑениÑ. 16 * ÐÑÐ¸Ð¼ÐµÑ Ð²Ñзова: RsJsCore.utils.fetchJSON(...); 17 */ 18 utils: { 19 /** 20 * ÐмиÑиÑÑÐµÑ Ð»Ð¾Ð³Ð¸ÐºÑ ÑабоÑÑ jQuery().on(event, selector, callback). 21 * ÐапÑÑÐºÐ°ÐµÑ callback, когда element полÑÑÐ°ÐµÑ ÑобÑÑие eventName, возникÑее на ÑлеменÑе selector 22 * ÐозвÑаÑÐ°ÐµÑ ÑлеменÑ, ÑооÑвеÑÑÑвÑÑÑий selector в ÑвойÑÑве event.rsTarget 23 * 24 * @param eventName ÐÐ¼Ñ ÑобÑÑÐ¸Ñ 25 * @param selector СелекÑоÑ, на коÑоÑом ожидаеÑÑÑ ÑобÑÑие 26 * @param callback Callback-ÑÑнкÑÐ¸Ñ 27 * @param element ÐлеменÑ, на коÑоÑом ожидаеÑÑÑ ÑобÑÑие. Ðо ÑмолÑÐ°Ð½Ð¸Ñ document 28 */ 29 on(eventName, selector, callback, element) { 30 element = element ? element : document; 31 element.addEventListener(eventName, (event) => { 32 event.rsTarget = event.target.closest(selector); 33 if (event.rsTarget) { 34 callback(event); 35 } 36 }); 37 }, 38 /** 39 * ÐÑполнÑÐµÑ Ð·Ð°Ð¿ÑÐ¾Ñ Ðº ÑÐ´Ð°Ð»ÐµÐ½Ð½Ð¾Ð¼Ñ ÑеÑвеÑÑ Ð¸ Ð¾Ð¶Ð¸Ð´Ð°ÐµÑ Ð¾Ñ Ð½ÐµÐ³Ð¾ оÑÐ²ÐµÑ Ð² ÑоÑмаÑе JSON. ÐбеÑÑка над ÑиÑÑемной fetch. 40 * ÐÐ°Ð½Ð½Ð°Ñ ÑÑнкÑÐ¸Ñ Ð¾Ð±ÑабаÑÑÐ²Ð°ÐµÑ Ð¾ÑибоÑнÑе оÑвеÑÑ Ð¸ визÑализиÑÑÐµÑ Ð¸Ñ . 41 * 42 * @param url 43 * @param options 44 * @returns {Promise<any>} 45 */ 46 fetchJSON(url, options) { 47 let defaults = { 48 credentials:'include', 49 headers: { 50 'X-Requested-With': 'XMLHttpRequest' 51 } 52 }; 53 54 let parameters = {...defaults, ...options}; 55 return fetch(url, parameters) 56 .then((response) => { 57 if (!response.ok) { 58 throw new Error(lang.t('ÐекоÑÑекÑнÑй ÑÑаÑÑÑ Ð¾ÑвеÑа ÑеÑвеÑа. ' + response.statusText)); 59 return; 60 } 61 return response.json() 62 .then((json) => { 63 if (RsJsCore.settings.utils.fetchResponseHandler) { 64 return RsJsCore.settings.utils.fetchResponseHandler(json, { 65 url:url, 66 fetchOptions:parameters 67 }); 68 } 69 return json; 70 }) 71 .then((json) => { 72 if (json.reloadPage) { 73 //ÐеÑезагÑÑзка ÑÑÑаниÑÑ Ð²Ñегда меÑодом GET 74 location.replace(window.location.href); 75 } 76 if (json.windowRedirect) { 77 location.href = json.windowRedirect; 78 } 79 80 return json; 81 }); 82 }).catch((error) => { 83 if (error.name !== 'AbortError') { 84 if (RsJsCore.plugins.toast) { //ÐÑли ÑÑÑановлен плагин, Ð´Ð»Ñ Ð¾ÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ ÑоÑÑов, Ñо оÑобÑажем оÑÐ¸Ð±ÐºÑ 85 RsJsCore.plugins.toast.show(lang.t('ÐÑибка'), error.message, { 86 className: 'error' 87 }); 88 } 89 throw error; 90 } 91 }); 92 }, 93 /** 94 * ÐозвÑаÑÐ°ÐµÑ ÑÑÑокÑ, где пеÑÐ²Ð°Ñ Ð±Ñква вÑегда пÑопиÑÐ½Ð°Ñ 95 * 96 * @param name 97 * @returns {string} 98 */ 99 getLowerCamelName(name) { 100 return name[0].toLowerCase() + name.slice(1); 101 } 102 }, 103 104 plugins: {}, 105 components: {}, 106 /** 107 * СекÑÐ¸Ñ Ð´Ð»Ñ Ð¿ÐµÑегÑÑзки наÑÑÑоек компоненÑов. 108 * ÐодклÑÑайÑе каÑÑомнÑе наÑÑÑойки до загÑÑзки компоненÑа. 109 * 110 * ÐÑÐ¸Ð¼ÐµÑ Ð¸ÑполÑзованиÑ: 111 * RsJsCore.settings.component.listProducts = {...ÑÑÑ ÐºÐ°ÑÑомнÑе наÑÑÑойки...} 112 */ 113 settings: { 114 component: {}, 115 plugin: {}, 116 utils: { 117 /** 118 * ÐжидаеÑÑÑ callback, коÑоÑÑй бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ð¿ÐµÑвÑм на полÑÑение вÑÐµÑ Ð´Ð°Ð½Ð½ÑÑ ÑеÑез fetchJSON 119 * callback бÑÐ´ÐµÑ Ð²ÑзÑваÑÑÑÑ Ñо ÑледÑÑÑими аÑгÑменÑами: 120 * callback(json, {url, fetchOptions}), где json - возвÑаÑаемÑй ÑеÑвеÑом json, url - адÑÐµÑ Ð·Ð°Ð¿ÑоÑа, fetchOptions - паÑамеÑÑÑ Ð·Ð°Ð¿ÑоÑа 121 * еÑли callback веÑÐ½ÐµÑ json, Ñо вÑполнение ÑÑандаÑÑнÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиков .then() пÑодолжиÑÑÑ. 122 * еÑли callback веÑÐ½ÐµÑ Promise.reject(), Ñо вÑполнение ÑÑандаÑÑнÑÑ Ð¿Ð¾Ð´Ð¿Ð¸ÑÑиков .then() не ÑоÑÑоиÑÑÑ. 123 */ 124 fetchResponseHandler:null 125 } 126 }, 127 /** 128 * РегиÑÑÑиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ Ð¿Ð»Ð°Ð³Ð¸Ð½Ð° 129 * 130 * @param key 131 * @param plugin 132 */ 133 addPlugin(plugin, key) { 134 if (!key) { 135 key = this.utils.getLowerCamelName(plugin.constructor.name); 136 } 137 this.plugins[key] = plugin; 138 }, 139 140 /** 141 * РегиÑÑÑиÑÑÐµÑ Ð¾Ð±ÑÐµÐºÑ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа 142 * 143 * @param component 144 * @param key 145 */ 146 addComponent(component, key) { 147 if (!key) { 148 key = this.utils.getLowerCamelName(component.constructor.name); 149 } 150 this.components[key] = component; 151 }, 152 153 /** 154 * ÐдеÑÑ ÑазмеÑаÑÑÑÑ Ð±Ð°Ð·Ð¾Ð²Ñе клаÑÑÑ Ð´Ð»Ñ ÑазлиÑнÑÑ ÑÑÑноÑÑей 155 */ 156 classes: { 157 /** 158 * ÐазовÑй клаÑÑ Ð´Ð»Ñ Ð»ÑбÑÑ ÐºÐ»Ð°ÑÑов, ÑодеÑжаÑÐ¸Ñ Ð»Ð¾Ð³Ð¸ÐºÑ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа или Ñелой ÑÑÑаниÑÑ. 159 * ÐÑимеÑ: ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ "ÐÑоÑмление заказа" - обеÑпеÑÐ¸Ð²Ð°ÐµÑ ÐºÐ¾ÑÑекÑнÑÑ ÑабоÑÑ Ð²Ñей ÑÑÑаниÑÑ 160 * ÐÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ "ÐÑзÑÐ²Ñ Ð¾ ÑоваÑе", ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñ "Ðлок вÑбоÑа гоÑода",... 161 */ 162 component: class { 163 constructor() { 164 this.utils = RsJsCore.utils; 165 this.plugins = RsJsCore.plugins; 166 RsJsCore.addComponent(this); 167 } 168 169 getExtendsSettings() { 170 let selfName = this.utils.getLowerCamelName(this.constructor.name); 171 if (RsJsCore.settings.component[selfName]) { 172 return RsJsCore.settings.component[selfName]; 173 } 174 return {}; 175 } 176 }, 177 178 /** 179 * ÐазовÑй клаÑÑ Ð´Ð»Ñ Ð»ÑбÑÑ ÐºÐ»Ð°ÑÑов-плагинов. Ðлагин - ÑÑо обÑекÑ, коÑоÑÑй иÑполÑзÑеÑÑÑ 180 * неÑколÑкими компоненÑами. ÐÑимеÑ: модалÑнÑе окна, ÑабоÑа Ñ cookie, ... 181 */ 182 plugin: class { 183 constructor() { 184 this.utils = RsJsCore.utils; 185 this.plugins = RsJsCore.plugins; 186 RsJsCore.addPlugin(this); 187 } 188 189 getExtendsSettings() { 190 let selfName = this.utils.getLowerCamelName(this.constructor.name);
191 if (RsJsCore.settings.plugin[selfName]) { 192 return RsJsCore.settings.plugin[selfName]; 193 } 194 return {}; 195 } 196 } 197 }, 198 199 /** 200 * ÐниÑиализиÑÑÐµÑ Ð·Ð°Ð¿ÑÑк lifecycle меÑодов в компоненÑÐ°Ñ 201 */ 202 init() { 203 document.addEventListener('DOMContentLoaded', (event) => { 204 for(let key in this.components) { 205 if (typeof(this.components[key].onDocumentReady) == 'function') { 206 this.components[key].onDocumentReady.call(this.components[key], event); 207 } 208 if (typeof(this.components[key].onContentReady) == 'function') { 209 this.components[key].onContentReady.call(this.components[key], event); 210 } 211 } 212 213 //СобÑÑие вÑполнÑеÑÑÑ, когда вÑе компоненÑÑ Ñже вÑполнили onDocumentReady, 214 for(let key in this.components) { 215 if (typeof (this.components[key].onAfterDocumentReady) == 'function') { 216 this.components[key].onAfterDocumentReady.call(this.components[key], event); 217 } 218 } 219 }); 220 221 document.addEventListener('new-content', (event) => { 222 for(let key in this.components) { 223 if (typeof(this.components[key].onContentReady) == 'function') { 224 this.components[key].onContentReady.call(this.components[key], event); 225 } 226 } 227 }); 228 } 229}; 230 231RsJsCore.init();
Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.