Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <script>
- jQuery(document).on('ready', async function(){
- document.getElementById("show_request_for").remove()
- document.getElementById("add-cc-button").remove()
- console.log('[INIT]')
- if (window.location.pathname === "/support/catalog/items/27") {
- const durationList = {
- "...": false,
- "Full day": true,
- "Half day": true,
- "Short visit (up to 2 hours)": false
- }
- const officeList = {
- "...": false,
- "Toronto": true,
- "Gulliver": true,
- "Lviv": true,
- "Lab64": true,
- "Lab72": true,
- "Rancho 1": false,
- "Rancho 2": false,
- "QA Studio": false
- }
- const officeMeido = {
- "...": false,
- "Toronto": true,
- "Gulliver": false,
- "Lviv": false,
- "Lab64": true,
- "Lab72": true,
- "Rancho 1": false,
- "Rancho 2": false,
- "QA Studio": false
- }
- const officeAddress = {
- "...": "",
- "Toronto": "м. Київ, вул. Велика Васильківська 100, 8 поверх",
- "Gulliver": "м. Київ, площа Спортивна 1А, 5-6 поверх",
- "Lviv": "м. Львів, вул. Поповича, 9",
- "Lab64": "м. Київ, вул. Велика Васильківська 64",
- "Lab72": "м. Київ, вул. Велика Васильківська 72",
- "Rancho 1": "м. Київ, пров. Малокитаївський, 12",
- "Rancho 2": "м. Київ, вул. Травнева 28",
- "QA Studio": "м. Київ, вул. Північно-Сирецька 1-3"
- }
- const accessWeek = {
- "...": false,
- "Current week": true,
- "Next week": true
- }
- const mealTypes = [
- "Non-vegan",
- "Vegan"
- ]
- const fsFields = {
- duration: "requested_item_values_27_requested_item_value_attributes_cf_visit_duration_63350",
- support_with_lunch: "requested_item_values_27_requested_item_value_attributes_cf_support_with_lunch_63350",
- access_week: "requested_item_values_27_requested_item_value_attributes_cf_access_week_63350",
- lunch_type: "requested_item_values_27_requested_item_value_attributes_cf_lunch_type_63350",
- office: "requested_item_values_27_requested_item_value_attributes_cf_office_63350",
- dates: [
- "requested_item_values_27_requested_item_value_attributes_cf_date_1_63350_date",
- "requested_item_values_27_requested_item_value_attributes_cf_date_2_63350_date",
- "requested_item_values_27_requested_item_value_attributes_cf_date_3_63350_date",
- "requested_item_values_27_requested_item_value_attributes_cf_date_4_63350_date",
- "requested_item_values_27_requested_item_value_attributes_cf_date_5_63350_date"
- ],
- additional_locations: [
- "requested_item_values_27_requested_item_value_attributes_cf_additional_location_1_63350",
- "requested_item_values_27_requested_item_value_attributes_cf_additional_location_2_63350"
- ],
- document_text: "requested_item_values_27_requested_item_value_attributes_cf_document_63350",
- document_check: "requested_item_values_27_requested_item_value_attributes_cf_document_agree_63350",
- meido: "requested_item_values_27_requested_item_value_attributes_cf_meido-body_63350"
- }
- // -------------------------
- meidoActive = true
- meidoToken = "test"
- // -------------------------
- // ====================================================================
- // ====================================================================
- // ====================================================================
- const fsNative = {
- duration: document.getElementById(fsFields.duration),
- support_with_lunch: document.getElementById(fsFields.support_with_lunch).parentNode.childNodes.item(0),
- access_week: document.getElementById(fsFields.access_week),
- lunch_type: document.getElementById(fsFields.lunch_type),
- office: document.getElementById(fsFields.office),
- meido: document.getElementById(fsFields.meido),
- dates: getElemList(fsFields.dates),
- additional_locations: getElemList(fsFields.additional_locations),
- document_text: document.getElementById(fsFields.document_text),
- document_check: document.getElementById(fsFields.document_check).parentNode.childNodes.item(0)
- }
- var activeDateCount = 0
- const today = new Date()
- const todayGlobal = today.toLocaleDateString()
- const weekdayGlobal = today.getDay()
- const currentTimeGlobal = today.getHours()
- const durationSelector = replaceInputWithDropdown(fsFields.duration, durationList, "duration")
- const officeSelector = replaceInputWithDropdown(fsFields.office, officeList, "office")
- const accessWeekSelector = replaceInputWithDropdown(fsFields.access_week, accessWeek, "access-week")
- const lunchTypeSelector = createSimplifiedDropdown(fsFields.lunch_type, mealTypes, "lunch_type")
- const lunchCheckboxLabel = document.createTextNode("Please support me with lunch (meals will be provided only on Mon-Fri and in case your office visit is more than 2 hours)")
- const lunchCheckbox = createCustomCheckbox(document.getElementById(fsFields.support_with_lunch).parentNode, "show-lunch", lunchCheckboxLabel)
- const dateList = createCustomDates(fsNative.dates)
- const additionalOfficesList = createAdditionalOfficeSelectors(fsFields.additional_locations, officeList)
- //add hotDeskCheckbox
- const hotdeskCheckboxLabel = document.createTextNode("I don`t have a permanent seat and would like to book a hot desk.");
- const hotdeskCheckboxContainer = document.createElement('div');
- document.getElementById(fsFields.office).parentNode.appendChild(hotdeskCheckboxContainer);
- const hotdeskCheckbox = createCustomCheckbox(hotdeskCheckboxContainer, "show-hotdesk", hotdeskCheckboxLabel);
- hotdeskCheckbox.checked = false;
- const hotdeskText = document.createElement("p");
- hotdeskText.innerHTML = "Please, follow the <a href='https://ringukraine.officespacesoftware.com/visual-directory/floors/139' style:='color:lightblue;cursor:pointer;' target='_blank'>link</a> for hot desks booking system (applicable only for Full/half-day visit). Here`re <a href='https://docs.google.com/document/d/1llpCz3RbK0cBew7kSJhZPQwD5Om8Kgj0tTq-1kgONx4/edit' style:='color:lightblue;cursor:pointer;' target='_blank'>instructions</a> on how to make a booking.";
- hotdeskCheckboxContainer.appendChild(hotdeskText);
- const documentCheckboxLabel = document.createElement("span")
- documentCheckboxLabel.innerHTML = "Я, {{ current_user.phone }}, ознайомився з документом та підтверджую що мій стан відповідає нормам відвідування офісу згідно з заявою.<br>*[✓] <i>означає, що дана відмітка прирівнюється до власноручного/факсимільного відтворення підпису особи.</i>"
- const documentCheckbox = createCustomCheckbox(fsNative.document_check.parentNode, "document-check", documentCheckboxLabel)
- const documentText = createDocumentSection(fsNative.document_text, todayGlobal)
- const dateControlAdd = document.createElement("button")
- dateControlAdd.innerHTML = "+"
- const dateControlRemove = document.createElement("button")
- dateControlRemove.innerHTML = "-"
- lunchCheckbox.parentNode.hidden = true;
- lunchTypeSelector.parentNode.hidden = true;
- hotdeskCheckboxContainer.hidden = true;
- hotdeskText.hidden = true;
- durationSelector.addEventListener("change", function(){ renderController() })
- officeSelector.addEventListener("change", function(){ renderController() })
- accessWeekSelector.addEventListener("change", function(){ renderController() })
- lunchCheckbox.addEventListener("change", function(){ renderController() })
- hotdeskCheckbox.addEventListener("change", function(){ renderController() })
- lunchTypeSelector.addEventListener("change", function(){ renderController() })
- dateList.forEach(dateElem => {
- jQuery(dateElem).datepicker("option", {
- onSelect: function() {
- renderController()
- }
- })
- })
- dateControlAdd.addEventListener("click", function(e){
- e.preventDefault()
- activeDateCount += 1
- renderController()
- })
- dateControlRemove.addEventListener("click", function(e){
- e.preventDefault()
- activeDateCount -= 1
- renderController()
- })
- additionalOfficesList.forEach(elem => {
- elem.addEventListener("change", function(){ renderController() })
- })
- documentCheckbox.addEventListener("change", function(){ renderController() })
- var meidoMenu
- if (meidoActive) {
- document.getElementById(fsFields.meido).parentNode.style.display = "none"
- const elems = document.getElementsByClassName("main pull-left")
- meidoMenu = await meidoInit(elems[0], dateList, fsFields.meido, 250, false) // change 250 to required limit
- console.log(meidoMenu)
- meidoMenu.hidden = true
- console.log("calling renderController")
- renderController()
- } else {
- renderController()
- }
- function renderController(){
- var values = {
- duration: durationSelector.value,
- office: officeSelector.value,
- access_week: accessWeekSelector.value
- }
- fsNative.duration.value = values.duration === "..." ? "" : values.duration
- fsNative.office.value = values.office === "..." ? "" : values.office
- if (fsNative.office.value === 'Toronto') {
- hotdeskCheckboxContainer.hidden = false;
- } else {
- hotdeskCheckbox.checked = false;
- hotdeskCheckboxContainer.hidden = true;
- }
- if (!hotdeskCheckbox.checked) {
- hotdeskText.hidden = true;
- } else {
- hotdeskText.hidden = false;
- }
- const accessWeekChanged = fsNative.access_week.value === values.access_week ? false : true
- fsNative.access_week.value = values.access_week === "..." ? "" : values.access_week
- var datesInRequest = dateList.map(x => x.value).filter(x => !!x)
- if (activeDateCount === 0) datesInRequest = datesInRequest[0] ? [datesInRequest[0]] : []
- const today = new Date().toISOString().split("T")[0]
- if (durationList[values.duration] && officeList[values.office] && accessWeek[values.access_week] && datesInRequest.length && !(datesInRequest.length === 1 && datesInRequest[0] === today) && !accessWeekChanged) {
- lunchCheckbox.parentNode.hidden = false
- } else {
- lunchCheckbox.parentNode.hidden = true
- lunchCheckbox.checked = false
- }
- values.support_with_lunch = lunchCheckbox.checked
- fsNative.support_with_lunch.value = lunchCheckbox.checked ? "1" : "0"
- if (values.support_with_lunch) {
- if (meidoActive) {
- if (weekdayGlobal === 6 || weekdayGlobal === 0 || (weekdayGlobal === 5 && currentTimeGlobal >= 19) || values.access_week === "Current week" || !officeMeido[values.office]) {
- lunchTypeSelector.parentNode.hidden = false
- lunchTypeSelector.value = lunchTypeSelector.value ? lunchTypeSelector.value : mealTypes[0]
- meidoMenu.hidden = true
- } else {
- lunchTypeSelector.parentNode.hidden = true
- lunchTypeSelector.value = null
- meidoMenu.hidden = false
- }
- } else {
- lunchTypeSelector.parentNode.hidden = false
- lunchTypeSelector.value = lunchTypeSelector.value ? lunchTypeSelector.value : mealTypes[0]
- }
- } else {
- lunchTypeSelector.parentNode.hidden = true
- lunchTypeSelector.value = null
- if (meidoActive) meidoMenu.hidden = true
- }
- values.lunch_type = lunchTypeSelector.value
- fsNative.lunch_type.value = values.lunch_type ? values.lunch_type : ""
- const dateLimits = (values.access_week === "...") ? null : calcDateLimits(values.access_week === "Current week" ? true : false)
- const dateLimitsRaw = dateLimits ? dateLimits.map(x => new Date(x).valueOf()) : null
- var existingDates = []
- var lastUsedFound = false;
- if (accessWeekChanged) activeDateCount = 0
- dateList.forEach((dateElem, index) => {
- const dateNativeElem = fsNative.dates[index]
- const timeNativeElem = document.getElementById(fsFields.dates[index].substring(0, fsFields.dates[index].length - 4) + "time")
- const errorElem = document.getElementById("date_custom_" + (index+1) + "-error")
- if (errorElem) errorElem.style.display = "none"
- if (accessWeekChanged && index === 0) dateElem.value = null
- const dateRawValue = new Date(dateElem.value).valueOf()
- if (existingDates.includes(dateRawValue)) dateElem.value = null
- if (dateLimits) {
- jQuery("#date_custom_"+(index+1)).datepicker("option", {
- minDate: new Date(dateLimits[0]),
- maxDate: new Date(dateLimits[1])
- })
- dateElem.disabled = false
- if (dateRawValue < dateLimitsRaw[0] || dateRawValue > dateLimitsRaw[1]) dateElem.value = null
- } else {
- dateElem.disabled = true
- }
- existingDates.push(dateRawValue)
- const controlWrapper = document.getElementById("controls_" + index)
- controlWrapper.innerHTML = ""
- if (dateElem.value) {
- dateNativeElem.value = reverseForFS(dateElem.value)
- timeNativeElem.value = "00:00"
- } else {
- dateNativeElem.value = null
- timeNativeElem.value = null
- }
- controlWrapper.style.display = "inline"
- if (index < activeDateCount) {
- dateElem.disabled = true
- dateElem.parentNode.style.display = "block"
- } else if (index === activeDateCount) {
- if (dateLimits) dateElem.disabled = false
- if (index > 0 && dateList[index-1].value) {
- const nextDate = new Date(dateList[index-1].value)
- nextDate.setDate(nextDate.getDate() + 1)
- jQuery("#date_custom_"+(index+1)).datepicker("option", {
- minDate: nextDate
- })
- }
- dateElem.parentNode.style.display = "block"
- if (activeDateCount > 0) controlWrapper.appendChild(dateControlRemove)
- if (activeDateCount < dateList.length-1) {
- controlWrapper.appendChild(dateControlAdd)
- dateControlAdd.disabled = !dateElem.value
- }
- } else {
- dateElem.parentNode.style.display = "none"
- dateElem.value = null
- dateNativeElem.value = null
- timeNativeElem.value = null
- }
- })
- if (meidoActive) meidoCart.calcDateCollection()
- values.additional_offices = []
- additionalOfficesList.forEach((elem, index) => {
- values.additional_offices.push(elem.value)
- if ((index === 0 && values.office !== "...") || (index > 0 && values.additional_offices[index-1] !== "...")) {
- elem.parentNode.style.display = "block"
- } else {
- elem.parentNode.style.display = "none"
- elem.value = "..."
- }
- fsNative.additional_locations[index].value = elem.value === "..." ? null : elem.value
- })
- values.document_check = documentCheckbox.checked
- fsNative.document_check.value = documentCheckbox.checked ? "1" : "0"
- fsNative.document_check.checked = documentCheckbox.checked
- const documentLocations = [values.office, values.additional_offices].flat().map(x => officeAddress[x]).filter(x => !!x).join(", ")
- document.getElementById("doc-address").innerHTML = documentLocations
- // =================================================
- var text = `Заява на допуск до користування Простором Товариства з обмеженою відповідальністю «ТекХостинг» (далі – ТОВ «ТекХостинг»)
- Я, фізична особа-підприємець ${"{{ current_user.phone }}"}, прошу допустити мене до користування офісним простором ТОВ «ТекХостинг» (далі – Простір), що знаходиться за адресою: ${documentLocations}.
- Я підтверджую, що на момент надання мені доступу до користування Простором:
- • у мене відсутні будь-які ознаки ГРВІ, а саме: підвищена температура тіла (більше 37,2 С), кашель, утруднене дихання тощо;
- • я ознайомлений(а) з рекомендаціями МОЗ та ВООЗ щодо попередження зараження COVID-19 та їх дотримуюсь;
- • протягом останніх 14 днів я не перебував(ла) за межами України та не контактував(ла) з особами, щодо яких наявна підозра/хворими на COVID-19.
- Я зобов’язуюсь під час користування Простором дотримуватися посилених санітарно-гігієнічних норм, а також рекомендацій МОЗ та ВООЗ щодо запобігання поширенню COVID-19, а саме:
- • носити медичну маску/респіратор;
- • ретельно мити руки з милом протягом 20-40 сек. та регулярно обробляти їх антисептичним засобом під час перебування в Просторі;
- • дотримуватися дистанції min 1,5 (півтора) метри від інших відвідувачів Простору.
- Дата: ${todayGlobal}`
- // =================================================
- fsNative.document_text.value = text
- }
- }
- if (window.location.pathname === "/support/catalog/items/28") {
- const fsFields = {
- from: "requested_item_values_28_requested_item_value_attributes_cf_from_63350",
- to: "requested_item_values_28_requested_item_value_attributes_cf_to_63350",
- country: "requested_item_values_28_requested_item_value_attributes_cf_office_list_63350"
- }
- const countryBlacklist = [
- "North Korea",
- "Lebanon"
- ]
- // =====================================================
- const fsNative = {
- dates: [
- {
- date: document.getElementById(fsFields.from + "_date"),
- time: document.getElementById(fsFields.from + "_time")
- },
- {
- date: document.getElementById(fsFields.to + "_date"),
- time: document.getElementById(fsFields.to + "_time")
- }
- ],
- country: document.getElementById(fsFields.country)
- }
- /*
- const countryDropdown = createSimplifiedDropdown(fsFields.country, [], "country")
- countryDropdown.addEventListener("change", function(){ renderController() })
- fetch("https://restcountries.eu/rest/v2/all").then(res => {
- return res.json()
- }).then(countries => {
- countries.forEach(country => {
- console.log(country.name)
- if (!countryBlacklist.includes(country.name)) {
- const option = document.createElement("option")
- option.innerHTML = country.name
- option.value = country.name
- countryDropdown.appendChild(option)
- }
- })
- renderController()
- })
- */
- const dateList = createCustomDates(fsNative.dates.map(x => x.date))
- const minDate = new Date()
- minDate.setDate(minDate.getDate() + 14)
- dateList.forEach(dateElem => {
- dateElem.parentNode.style.display = "block"
- jQuery(dateElem).datepicker("option", {
- onSelect: function() {
- renderController()
- },
- minDate: minDate
- })
- })
- renderController()
- function renderController(){
- dateList.forEach((dateElem, index) => {
- if (dateElem.value) {
- fsNative.dates[index].date.value = reverseForFS(dateElem.value)
- fsNative.dates[index].time.value = "00:00"
- } else {
- fsNative.dates[index].date.value = null
- fsNative.dates[index].time.value = null
- }
- })
- //fsNative.country.value = countryDropdown.value
- }
- }
- if (window.location.pathname === "/support/catalog/items/30") {
- console.log("dates init")
- const fsFields = {
- dates: [
- "requested_item_values_30_requested_item_value_attributes_cf_date1_63350",
- "requested_item_values_30_requested_item_value_attributes_cf_date2_63350",
- "requested_item_values_30_requested_item_value_attributes_cf_date3_63350",
- "requested_item_values_30_requested_item_value_attributes_cf_date4_63350",
- "requested_item_values_30_requested_item_value_attributes_cf_date5_63350"
- ]
- }
- //==============================================================================
- const fsNative = {
- dates: getElemList(fsFields.dates)
- }
- var activeDateCount = 0
- const dateList = createCustomDates(fsFields.dates.map(x => document.getElementById(x+"_date")))
- const today = new Date()
- const max = new Date()
- max.setDate(max.getDate() + 7 + (today.getDay() === 0 ? 0 : 7 - today.getDay()))
- dateList.forEach(dateElem => {
- jQuery(dateElem).datepicker("option", {
- onSelect: function() {
- renderController()
- },
- minDate: today,
- maxDate: max
- })
- })
- const dateControlAdd = document.createElement("button")
- dateControlAdd.innerHTML = "+"
- const dateControlRemove = document.createElement("button")
- dateControlRemove.innerHTML = "-"
- dateControlAdd.addEventListener("click", function(e){
- e.preventDefault()
- activeDateCount += 1
- renderController()
- })
- dateControlRemove.addEventListener("click", function(e){
- e.preventDefault()
- activeDateCount -= 1
- renderController()
- })
- renderController()
- function renderController(){
- dateList.forEach((dateElem, index) => {
- const date = document.getElementById(fsFields.dates[index] + "_date")
- const time = document.getElementById(fsFields.dates[index] + "_time")
- const errorElem = document.getElementById("date_custom_" + (index+1) + "-error")
- if (errorElem) errorElem.style.display = "none"
- if (dateElem.value) {
- date.value = reverseForFS(dateElem.value)
- time.value = "00:00"
- } else {
- date.value = null
- time.value = null
- }
- const controlWrapper = document.getElementById("controls_" + index)
- controlWrapper.innerHTML = ""
- controlWrapper.style.display = "inline"
- if (index < activeDateCount) {
- dateElem.disabled = true
- dateElem.parentNode.style.display = "block"
- } else if (index === activeDateCount) {
- dateElem.disabled = false
- if (index > 0 && dateList[index-1].value) {
- const nextDate = new Date(dateList[index-1].value)
- nextDate.setDate(nextDate.getDate() + 1)
- jQuery("#date_custom_"+(index+1)).datepicker("option", {
- minDate: nextDate
- })
- }
- dateElem.parentNode.style.display = "block"
- if (activeDateCount > 0) controlWrapper.appendChild(dateControlRemove)
- if (activeDateCount < dateList.length-1) {
- controlWrapper.appendChild(dateControlAdd)
- dateControlAdd.disabled = !dateElem.value
- }
- } else {
- dateElem.parentNode.style.display = "none"
- dateElem.value = null
- date.value = null
- time.value = null
- }
- })
- }
- }
- })
- function replaceInputWithDropdown(targetId, dataset, facsId = null){
- const nativeContainer = document.getElementById(targetId).parentNode
- document.getElementById(targetId).style.display = "none"
- const selector = document.createElement("select")
- selector.id = facsId
- for (let optionName in dataset) {
- const option = document.createElement("option")
- option.innerHTML = optionName
- option.value = optionName
- selector.appendChild(option)
- }
- nativeContainer.appendChild(selector)
- return selector
- }
- function createSimplifiedDropdown(targetId, dataset, facsId = null){
- const nativeContainer = document.getElementById(targetId).parentNode
- document.getElementById(targetId).style.display = "none"
- const selector = document.createElement("select")
- selector.id = facsId
- dataset.forEach(optionName => {
- const option = document.createElement("option")
- option.innerHTML = optionName
- option.value = optionName
- selector.appendChild(option)
- })
- nativeContainer.appendChild(selector)
- return selector
- }
- function createCustomCheckbox(container, id, labelText){
- container.childNodes.forEach(elem => {
- elem.style.display = "none"
- })
- const checkboxWrapper = document.createElement("div")
- const checkbox = document.createElement("input")
- checkbox.type = "checkbox"
- checkbox.id = id
- const checkboxLabel = document.createElement("label")
- checkboxLabel.htmlFor = id
- checkboxLabel.style.display = "inline"
- checkboxLabel.style.marginLeft = "5px"
- checkboxLabel.appendChild(labelText)
- checkboxWrapper.appendChild(checkbox)
- checkboxWrapper.appendChild(checkboxLabel)
- container.appendChild(checkboxWrapper)
- return checkbox
- }
- function createCustomDates(nativeList){
- var customDateCollection = []
- nativeList.forEach((dateNativeField, index) => {
- dateNativeField.parentNode.style.display = "none"
- const dateField = document.createElement("input")
- const elemId = "date_custom_" + (index + 1)
- dateField.id = elemId
- const controlWrapper = document.createElement("span")
- controlWrapper.id = "controls_" + index
- controlWrapper.style.marginLeft = "5px"
- dateNativeField.parentNode.parentNode.append(dateField)
- dateNativeField.parentNode.parentNode.append(controlWrapper)
- if (index > 0) dateNativeField.parentNode.parentNode.style.display = "none"
- customDateCollection.push(dateField)
- jQuery("#"+elemId).datepicker({
- dateFormat: "yy-mm-dd",
- firstDay: 1
- })
- })
- return customDateCollection
- }
- function createDocumentSection(target, todayGlobal){
- target.parentNode.childNodes.forEach(node => {
- node.style.display = "none"
- })
- const documentTextWrapper = document.createElement("div")
- const documentTextHeader = document.createElement("div")
- documentTextHeader.style.fontSize = "16px"
- const headerArrow = document.createElement("span")
- headerArrow.innerHTML = "▼"
- const headerTitle = document.createElement("span")
- headerTitle.innerHTML = "Текст документа (click to view)"
- documentTextHeader.appendChild(headerArrow)
- documentTextHeader.appendChild(headerTitle)
- const documentTextContent = document.createElement("div")
- documentTextHeader.onclick = function(){
- documentTextContent.hidden = !documentTextContent.hidden
- headerArrow.innerHTML = (headerArrow.innerHTML === "►" ? "▼" : "►")
- }
- documentTextContent.style.width = "600px"
- documentTextContent.style.margin = "15px"
- documentTextContent.insertAdjacentHTML('beforeend', '<div style="text-align: center"> <b>Заява на допуск до користування Простором Товариства з обмеженою відповідальністю «ТекХостинг» (далі – ТОВ «ТекХостинг»)</b> </div> <br> <div style="text-align: justify"> <p> Я, <b>фізична особа-підприємець</b> {{ current_user.phone }}, прошу допустити мене до користування офісним простором ТОВ «ТекХостинг» (далі – Простір), що знаходиться за адресою: <span id="doc-address"></span>. </p> <br> <p> <b>Я підтверджую</b>, що на момент надання мені доступу до користування Простором: <ul> <li>у мене відсутні будь-які ознаки ГРВІ, а саме: підвищена температура тіла (більше 37,2 С), кашель, утруднене дихання тощо;</li> <li>я ознайомлений(а) з рекомендаціями МОЗ та ВООЗ щодо попередження зараження COVID-19 та їх дотримуюсь;</li> <li>протягом останніх 14 днів я не перебував(ла) за межами України та не контактував(ла) з особами, щодо яких наявна підозра/хворими на COVID-19.</li> </ul> </p> <br> <p> <b>Я зобов’язуюсь</b> під час користування Простором дотримуватися посилених санітарно-гігієнічних норм, а також рекомендацій МОЗ та ВООЗ щодо запобігання поширенню COVID-19, а саме: <ul> <li>носити медичну маску/респіратор;</li> <li>ретельно мити руки з милом протягом 20-40 сек. та регулярно обробляти їх антисептичним засобом під час перебування в Просторі;</li> <li>дотримуватися дистанції min 1,5 (півтора) метри від інших відвідувачів Простору.</li> </ul> </p> </div><br> <div> <b>Дата</b>: ' + todayGlobal + ' </div>')
- documentTextContent.hidden = true
- documentTextWrapper.appendChild(documentTextHeader)
- documentTextWrapper.appendChild(documentTextContent)
- target.parentNode.appendChild(documentTextWrapper)
- return documentTextContent
- }
- function createAdditionalOfficeSelectors(ids, datalist){
- var list = []
- ids.forEach((id, index) => {
- const newID = "additional_office_" + (index+1)
- const selector = replaceInputWithDropdown(id, datalist, newID)
- selector.parentNode.style.display = "none"
- if (index > 0) selector.parentNode.childNodes.item("LABEL").style.display = "none"
- list.push(selector)
- })
- return list
- }
- function calcDateLimits(thisWeek){
- const nowDate = new Date()
- var limits = []
- if (thisWeek) {
- const dateMin = nowDate.toISOString().split("T")[0]
- const nowWeekDay = nowDate.getDay()
- const daysToAdd = !nowWeekDay ? 0 : 7 - nowWeekDay
- nowDate.setDate(nowDate.getDate() + daysToAdd)
- const dateMax = nowDate.toISOString().split("T")[0]
- limits.push(dateMin)
- limits.push(dateMax)
- } else {
- const nowWeekDay = nowDate.getDay()
- const daysToAdd = !nowWeekDay ? 1 : 7 - nowWeekDay + 1
- nowDate.setDate(nowDate.getDate() + daysToAdd)
- const dateMin = nowDate.toISOString().split("T")[0]
- nowDate.setDate(nowDate.getDate() + 6)
- const dateMax = nowDate.toISOString().split("T")[0]
- limits.push(dateMin)
- limits.push(dateMax)
- }
- return limits
- }
- function reverseForFS(date){
- if (!date) return null
- const vals = date.split("-")
- //return `${vals[2]}-${vals[1]}-${vals[0]}`
- return vals[2]+"-"+vals[1]+"-"+vals[0]
- }
- function getElemList(idList){
- var collection = []
- idList.forEach(id => {
- collection.push(document.getElementById(id))
- })
- return collection
- }
- // ==================== MEIDO ====================
- class MeidoCart{
- constructor(itemList, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate){
- console.log('constructing')
- this.itemList = itemList
- this.dailyLimit = limit
- //this.renderElementId = elemId
- this.renderTarget = cartElem
- this.reverseDate = reverseDate
- this.targetField = fsMeidoField
- this.dateElemsCollection = dateElemsCollection
- console.log(this.dateElemsCollection)
- this.dateCollection = null
- this.selectedRadio = null
- this.dateElemsCollection.forEach(dateElem => {
- dateElem.onchange = function(){
- this.calcDateCollection()
- this.render()
- }
- })
- }
- init(){
- this.calcDateCollection()
- }
- reverse(date){
- const vals = date.split("-")
- //return `${vals[2]}-${vals[1]}-${vals[0]}`
- return vals[2]+"-"+vals[1]+"-"+vals[0]
- }
- calcDateCollection(){
- if (!this.dateCollection) this.dateCollection = {}
- var flag = false
- var collection = []
- var dateObj = {}
- this.dateElemsCollection.forEach(dateElem => {
- if (dateElem.value) {
- flag = true
- collection.push(dateElem.value)
- }
- const weekday = new Date(dateElem.value).getDay()
- if (dateElem.value && weekday !== 6 && weekday !== 0){
- if (!this.dateCollection[dateElem.value]){
- dateObj[dateElem.value] = {
- limit: this.dailyLimit,
- items: {}
- }
- } else {
- dateObj[dateElem.value] = this.dateCollection[dateElem.value]
- }
- }
- })
- if (!this.selectedRadio || !collection.includes(this.selectedRadio)) this.selectedRadio = this.dateElemsCollection[0].value
- if (!flag) dateObj = null
- this.dateCollection = dateObj
- this.render()
- }
- get cartState(){
- return JSON.stringify(this.dateCollection)
- }
- render(){
- const wrapper = document.createElement("div")
- if (!this.dateCollection) {
- wrapper.innerHTML = "Диапазон дат указан неверно!"
- } else {
- for(let date in this.dateCollection){
- const dateWrapper = document.createElement("div")
- dateWrapper.className += "meido-cart-date-wrapper"
- const header = document.createElement("div")
- header.className += "meido-cart-date-header"
- const radio = document.createElement("input")
- radio.type = "radio"
- radio.id = date
- radio.value = date
- radio.name = "date-radio"
- radio.addEventListener('change', function(e){
- this.selectedRadio = e.target.value
- }.bind(this))
- if (date === this.selectedRadio) radio.checked = true
- header.appendChild(radio)
- const label = document.createElement("label")
- label.htmlFor = date
- //label.innerHTML += `${date} (остаток: ${this.dateCollection[date].limit} грн.)`
- label.innerHTML += date+" (остаток: "+this.dateCollection[date].limit+" грн.)"
- header.appendChild(label)
- dateWrapper.appendChild(header)
- var flag = false
- for(let item in this.dateCollection[date].items){
- flag = true
- const itemElem = document.createElement("div")
- itemElem.className += "meido-cart-item"
- const itemText = document.createElement("span")
- //itemText.innerHTML = `${this.dateCollection[date].items[item]} x ${this.itemList[item].name}`
- itemText.innerHTML = this.dateCollection[date].items[item]+" x "+this.itemList[item].name
- itemElem.appendChild(itemText)
- const itemRemove = document.createElement("button")
- itemRemove.innerHTML = "X"
- itemRemove.className += "meido-cart-item-remove"
- itemRemove.onclick = function(){ this.removeMeidoItem(item, date) }.bind(this)
- itemElem.appendChild(itemRemove)
- dateWrapper.appendChild(itemElem)
- }
- if (!flag) {
- const itemEmpty = document.createElement("div")
- itemEmpty.className += "meido-cart-item"
- itemEmpty.style.color = "grey"
- itemEmpty.innerHTML = "<i>Ничего не добавлено</i>"
- dateWrapper.appendChild(itemEmpty)
- }
- wrapper.appendChild(dateWrapper)
- }
- }
- this.renderTarget.innerHTML = ""
- this.renderTarget.appendChild(wrapper)
- document.getElementById(this.targetField).innerHTML = this.cartState
- }
- addMeidoItem(itemId){
- if (this.dateCollection[this.selectedRadio].limit - this.itemList[itemId].price >= 0) {
- if (!this.dateCollection[this.selectedRadio].items[itemId]) {
- this.dateCollection[this.selectedRadio].items[itemId] = 1
- } else {
- this.dateCollection[this.selectedRadio].items[itemId] += 1
- }
- this.dateCollection[this.selectedRadio].limit -= this.itemList[itemId].price
- } else {
- console.error('Insufficient funds!')
- }
- this.render()
- }
- removeMeidoItem(itemId, date){
- this.dateCollection[date].items[itemId] -= 1
- if (this.dateCollection[date].items[itemId] === 0) delete this.dateCollection[date].items[itemId]
- this.dateCollection[date].limit += this.itemList[itemId].price
- this.render()
- }
- }
- function meidoInit(container, dateElemsCollection, fsMeidoField, limit, reverseDate = false){
- const innerContainer = document.createElement("div")
- return fetch("https://analytics.getmeido.com/api/fs/product-list?token="+meidoToken)
- .then(res => {return res.json()})
- .then(data => {
- const title = document.createElement("h4")
- title.innerHTML = "Заказ еды Meido"
- innerContainer.appendChild(title)
- const mainWindow = buildMeidoWindow(data, dateElemsCollection, fsMeidoField, limit, reverseDate)
- innerContainer.appendChild(mainWindow)
- meidoCart.init()
- container.appendChild(innerContainer)
- return innerContainer
- }).catch(err => {
- console.error("[MEIDO] Cannot get Meido menu!")
- console.error(err)
- })
- }
- function buildMeidoWindow(apiData, dateElemsCollection, fsMeidoField, limit, reverseDate){
- const wrapper = document.createElement("div")
- wrapper.className += "meido-main-window"
- const menuElem = document.createElement("div")
- menuElem.id = "meido-menu"
- const cartElem = document.createElement("div")
- cartElem.id = "meido-cart"
- var categorized = {}
- var flat = {}
- apiData.forEach(item => {
- if (!categorized[item.product_contractor_title]) categorized[item.product_contractor_title] = {}
- if (!categorized[item.product_contractor_title][item.category_title]) categorized[item.product_contractor_title][item.category_title] = {}
- categorized[item.product_contractor_title][item.category_title][item.id] = item
- flat[item.id] = {
- name: item.product_title,
- price: parseInt(item.product_price)
- }
- })
- menuElem.appendChild(buildMenu(categorized))
- console.log(limit, dateElemsCollection, reverseDate)
- window.meidoCart = new MeidoCart(flat, limit, cartElem, dateElemsCollection, fsMeidoField, reverseDate)
- cartElem.className += "meido-cart-wrapper"
- wrapper.appendChild(menuElem)
- wrapper.appendChild(cartElem)
- return wrapper
- }
- function buildMenu(data){
- const wrapper = document.createElement("div")
- wrapper.className += "meido-menu-wrapper"
- for(let category in data){
- const categoryWrapper = document.createElement("div")
- const categoryHeader = document.createElement("div")
- categoryHeader.className += "meido-category-title"
- const categoryArrow = document.createElement("span")
- categoryArrow.className += "arrow"
- categoryArrow.innerHTML = "►"
- const categoryTitle = document.createElement("span")
- categoryTitle.innerHTML = category
- categoryHeader.appendChild(categoryArrow)
- categoryHeader.appendChild(categoryTitle)
- const categoryContent = document.createElement("div")
- categoryContent.className += "meido-category-content"
- categoryHeader.onclick = function(){
- categoryContent.hidden = !categoryContent.hidden
- categoryArrow.innerHTML = (categoryArrow.innerHTML === "►" ? "▼" : "►")
- }
- categoryContent.hidden = true
- categoryWrapper.appendChild(categoryHeader)
- for(let contractor in data[category]){
- const contractorWrapper = document.createElement("div")
- const contractorHeader = document.createElement("div")
- contractorHeader.className += "meido-contractor-title"
- const contractorArrow = document.createElement("span")
- contractorArrow.className += "arrow"
- contractorArrow.innerHTML = "►"
- const contractorTitle = document.createElement("span")
- contractorTitle.innerHTML = contractor
- contractorHeader.appendChild(contractorArrow)
- contractorHeader.appendChild(contractorTitle)
- const contractorContent = document.createElement("div")
- contractorContent.className += "meido-contractor-content"
- contractorHeader.onclick = function(){
- contractorContent.hidden = !contractorContent.hidden
- contractorArrow.innerHTML = (contractorArrow.innerHTML === "►" ? "▼" : "►")
- }
- contractorContent.hidden = true
- contractorWrapper.appendChild(contractorHeader)
- for(let item in data[category][contractor]){
- contractorContent.appendChild(buildMenuItem(data[category][contractor][item]))
- }
- contractorWrapper.appendChild(contractorContent)
- categoryContent.appendChild(contractorWrapper)
- }
- categoryWrapper.appendChild(categoryContent)
- wrapper.appendChild(categoryWrapper)
- }
- return wrapper
- }
- function buildMenuItem(item){
- const wrapper = document.createElement("div")
- wrapper.className += "meido-item"
- const itemTitle = document.createElement("div")
- itemTitle.innerHTML = "<u>" + item.product_title + "</u>"
- itemTitle.className += "meido-item-title"
- const itemPic = document.createElement("img")
- itemPic.src = item.photo_url
- itemPic.className += "meido-pic"
- const itemDesc = document.createElement("div")
- itemDesc.innerHTML = item.product_description
- const price = document.createElement("span")
- //price.innerHTML = `<i>Цена: ${item.product_price} грн.</i>`
- price.innerHTML = "<i>Цена: "+item.product_price+" грн.</i>"
- price.className += "meido-price"
- const add = document.createElement("button")
- add.innerHTML = "Добавить"
- add.className += "meido-add-button"
- add.onclick = null
- add.onclick = function(e){
- e.preventDefault()
- meidoCart.addMeidoItem(item.id)
- }
- wrapper.appendChild(itemTitle)
- wrapper.appendChild(itemPic)
- wrapper.appendChild(itemDesc)
- wrapper.appendChild(add)
- wrapper.appendChild(price)
- return wrapper
- }
- </script>
Add Comment
Please, Sign In to add comment