format work order milestone times
parent
29140b9520
commit
0caa6af372
|
|
@ -1,5 +1,5 @@
|
|||
import { acquireConnection } from './pool.js';
|
||||
import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString } from '@cityssm/utils-datetime';
|
||||
import { dateIntegerToString, dateStringToInteger, dateToInteger, timeIntegerToString, timeIntegerToPeriodString } from '@cityssm/utils-datetime';
|
||||
import * as configFunctions from '../functions.config.js';
|
||||
import { getLots } from './getLots.js';
|
||||
import { getLotOccupancies } from './getLotOccupancies.js';
|
||||
|
|
@ -67,6 +67,7 @@ export async function getWorkOrderMilestones(filters, options, connectedDatabase
|
|||
const database = connectedDatabase ?? (await acquireConnection());
|
||||
database.function('userFn_dateIntegerToString', dateIntegerToString);
|
||||
database.function('userFn_timeIntegerToString', timeIntegerToString);
|
||||
database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString);
|
||||
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters);
|
||||
let orderByClause = '';
|
||||
switch (options.orderBy) {
|
||||
|
|
@ -88,10 +89,14 @@ export async function getWorkOrderMilestones(filters, options, connectedDatabase
|
|||
const sql = 'select m.workOrderMilestoneId,' +
|
||||
' m.workOrderMilestoneTypeId, t.workOrderMilestoneType,' +
|
||||
' m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString,' +
|
||||
' m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' +
|
||||
' m.workOrderMilestoneTime,' +
|
||||
' userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' +
|
||||
' userFn_timeIntegerToPeriodString(m.workOrderMilestoneTime) as workOrderMilestoneTimePeriodString,' +
|
||||
' m.workOrderMilestoneDescription,' +
|
||||
' m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString,' +
|
||||
' m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' +
|
||||
' m.workOrderMilestoneCompletionTime,' +
|
||||
' userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' +
|
||||
' userFn_timeIntegerToPeriodString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimePeriodString,' +
|
||||
(options.includeWorkOrders ?? false
|
||||
? ' m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription,' +
|
||||
' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' +
|
||||
|
|
|
|||
|
|
@ -5,7 +5,8 @@ import {
|
|||
dateIntegerToString,
|
||||
dateStringToInteger,
|
||||
dateToInteger,
|
||||
timeIntegerToString
|
||||
timeIntegerToString,
|
||||
timeIntegerToPeriodString
|
||||
} from '@cityssm/utils-datetime'
|
||||
|
||||
import * as configFunctions from '../functions.config.js'
|
||||
|
|
@ -133,6 +134,7 @@ export async function getWorkOrderMilestones(
|
|||
|
||||
database.function('userFn_dateIntegerToString', dateIntegerToString)
|
||||
database.function('userFn_timeIntegerToString', timeIntegerToString)
|
||||
database.function('userFn_timeIntegerToPeriodString', timeIntegerToPeriodString)
|
||||
|
||||
// Filters
|
||||
const { sqlWhereClause, sqlParameters } = buildWhereClause(filters)
|
||||
|
|
@ -163,10 +165,14 @@ export async function getWorkOrderMilestones(
|
|||
'select m.workOrderMilestoneId,' +
|
||||
' m.workOrderMilestoneTypeId, t.workOrderMilestoneType,' +
|
||||
' m.workOrderMilestoneDate, userFn_dateIntegerToString(m.workOrderMilestoneDate) as workOrderMilestoneDateString,' +
|
||||
' m.workOrderMilestoneTime, userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' +
|
||||
' m.workOrderMilestoneTime,' +
|
||||
' userFn_timeIntegerToString(m.workOrderMilestoneTime) as workOrderMilestoneTimeString,' +
|
||||
' userFn_timeIntegerToPeriodString(m.workOrderMilestoneTime) as workOrderMilestoneTimePeriodString,' +
|
||||
' m.workOrderMilestoneDescription,' +
|
||||
' m.workOrderMilestoneCompletionDate, userFn_dateIntegerToString(m.workOrderMilestoneCompletionDate) as workOrderMilestoneCompletionDateString,' +
|
||||
' m.workOrderMilestoneCompletionTime, userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' +
|
||||
' m.workOrderMilestoneCompletionTime,' +
|
||||
' userFn_timeIntegerToString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimeString,' +
|
||||
' userFn_timeIntegerToPeriodString(m.workOrderMilestoneCompletionTime) as workOrderMilestoneCompletionTimePeriodString,' +
|
||||
(options.includeWorkOrders ?? false
|
||||
? ' m.workOrderId, w.workOrderNumber, wt.workOrderType, w.workOrderDescription,' +
|
||||
' w.workOrderOpenDate, userFn_dateIntegerToString(w.workOrderOpenDate) as workOrderOpenDateString,' +
|
||||
|
|
|
|||
|
|
@ -1106,7 +1106,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
? '<span class="has-text-grey">(No Set Date)</span>'
|
||||
: milestone.workOrderMilestoneDateString) +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? ' ' + milestone.workOrderMilestoneTimeString
|
||||
? ' ' + milestone.workOrderMilestoneTimePeriodString
|
||||
: '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
|
|
|
|||
|
|
@ -348,7 +348,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
? '<span class="has-text-grey">(No Set Date)</span>'
|
||||
: milestone.workOrderMilestoneDateString) +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? ' ' + milestone.workOrderMilestoneTimeString
|
||||
? ' ' + milestone.workOrderMilestoneTimePeriodString
|
||||
: '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
|
|
|
|||
|
|
@ -521,7 +521,7 @@ declare const bulmaJS: BulmaJS
|
|||
? '<span class="has-text-grey">(No Set Date)</span>'
|
||||
: milestone.workOrderMilestoneDateString) +
|
||||
(milestone.workOrderMilestoneTime
|
||||
? ' ' + milestone.workOrderMilestoneTimeString!
|
||||
? ' ' + milestone.workOrderMilestoneTimePeriodString!
|
||||
: '') +
|
||||
'<br />' +
|
||||
'<span class="is-size-7">' +
|
||||
|
|
|
|||
|
|
@ -81,7 +81,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTime === 0
|
||||
? ''
|
||||
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||
: milestone.workOrderMilestoneTimePeriodString + '<br />') +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? '<strong>' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType) +
|
||||
|
|
|
|||
|
|
@ -119,7 +119,7 @@ declare const cityssm: cityssmGlobal
|
|||
('<div class="column">' +
|
||||
(milestone.workOrderMilestoneTime === 0
|
||||
? ''
|
||||
: milestone.workOrderMilestoneTimeString + '<br />') +
|
||||
: milestone.workOrderMilestoneTimePeriodString! + '<br />') +
|
||||
(milestone.workOrderMilestoneTypeId
|
||||
? '<strong>' +
|
||||
cityssm.escapeHTML(milestone.workOrderMilestoneType!) +
|
||||
|
|
|
|||
File diff suppressed because one or more lines are too long
|
|
@ -1 +1 @@
|
|||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,s=document.querySelector("#form--searchFilters"),r=s.querySelector("#searchFilter--workOrderMilestoneDateFilter"),a=s.querySelector("#searchFilter--workOrderMilestoneDateString"),t=document.querySelector("#container--milestoneCalendar");function i(r){r&&r.preventDefault(),t.innerHTML=e.getLoadingParagraphHTML("Loading Milestones..."),cityssm.postJSON(e.urlPrefix+"/workOrders/doGetWorkOrderMilestones",s,s=>{!function(s){var r,a,i,o,n,l,c,d;if(0===s.length)return void(t.innerHTML='<div class="message is-info">\n <p class="message-body">There are no milestones that meet the search criteria.</p>\n </div>');t.innerHTML="";const p=cityssm.dateToString(new Date);let m,u="x";for(const M of s){u!==M.workOrderMilestoneDateString&&(m&&t.append(m),(m=document.createElement("div")).className="panel",m.innerHTML=`<h2 class="panel-heading">\n ${0===M.workOrderMilestoneDate?"No Set Date":M.workOrderMilestoneDateString}\n </h2>`,u=M.workOrderMilestoneDateString);const s=document.createElement("div");s.className="panel-block is-block",!M.workOrderMilestoneCompletionDate&&""!==M.workOrderMilestoneDateString&&M.workOrderMilestoneDateString<p&&s.classList.add("has-background-warning-light");let O="";for(const s of M.workOrderLots)O+='<span class="has-tooltip-left" data-tooltip="'+cityssm.escapeHTML(null!==(r=s.mapName)&&void 0!==r?r:"")+'"><i class="fas fa-vector-square" aria-label="'+e.escapedAliases.Lot+'"></i> '+cityssm.escapeHTML(null!==(a=s.lotName)&&void 0!==a?a:"")+"</span><br />";for(const s of M.workOrderLotOccupancies)for(const r of s.lotOccupancyOccupants)O+='<span class="has-tooltip-left" data-tooltip="'+cityssm.escapeHTML(null!==(i=r.lotOccupantType)&&void 0!==i?i:"")+'"><i class="fas fa-user" aria-label="'+e.escapedAliases.Occupancy+'"></i> '+cityssm.escapeHTML(null!==(o=r.occupantName)&&void 0!==o?o:"")+" "+cityssm.escapeHTML(null!==(n=r.occupantFamilyName)&&void 0!==n?n:"")+"</span><br />";s.innerHTML='<div class="columns"><div class="column is-narrow"><span class="icon is-small">'+(M.workOrderMilestoneCompletionDate?'<i class="fas fa-check" aria-label="Completed"></i>':'<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>')+'</span></div><div class="column">'+(0===M.workOrderMilestoneTime?"":M.workOrderMilestoneTimeString+"<br />")+(M.workOrderMilestoneTypeId?"<strong>"+cityssm.escapeHTML(M.workOrderMilestoneType)+"</strong><br />":"")+'<span class="is-size-7">'+cityssm.escapeHTML(M.workOrderMilestoneDescription)+'</span></div><div class="column"><i class="fas fa-circle" style="color:'+e.getRandomColor(null!==(l=M.workOrderNumber)&&void 0!==l?l:"")+'" aria-hidden="true"></i> <a class="has-text-weight-bold" href="'+e.getWorkOrderURL(M.workOrderId)+'">'+cityssm.escapeHTML(null!==(c=M.workOrderNumber)&&void 0!==c?c:"")+'</a><br /><span class="is-size-7">'+cityssm.escapeHTML(null!==(d=M.workOrderDescription)&&void 0!==d?d:"")+'</span></div><div class="column is-size-7">'+O+"</div></div>",m.append(s)}t.append(m)}(s.workOrderMilestones)})}r.addEventListener("change",()=>{a.closest("fieldset").disabled="date"!==r.value,i()}),e.initializeDatePickers(s),a.addEventListener("change",i),s.addEventListener("submit",i),i()})();
|
||||
"use strict";Object.defineProperty(exports,"__esModule",{value:!0}),(()=>{const e=exports.los,s=document.querySelector("#form--searchFilters"),r=s.querySelector("#searchFilter--workOrderMilestoneDateFilter"),a=s.querySelector("#searchFilter--workOrderMilestoneDateString"),t=document.querySelector("#container--milestoneCalendar");function i(r){r&&r.preventDefault(),t.innerHTML=e.getLoadingParagraphHTML("Loading Milestones..."),cityssm.postJSON(e.urlPrefix+"/workOrders/doGetWorkOrderMilestones",s,s=>{!function(s){var r,a,i,o,n,l,c,d;if(0===s.length)return void(t.innerHTML='<div class="message is-info">\n <p class="message-body">There are no milestones that meet the search criteria.</p>\n </div>');t.innerHTML="";const p=cityssm.dateToString(new Date);let m,u="x";for(const M of s){u!==M.workOrderMilestoneDateString&&(m&&t.append(m),(m=document.createElement("div")).className="panel",m.innerHTML=`<h2 class="panel-heading">\n ${0===M.workOrderMilestoneDate?"No Set Date":M.workOrderMilestoneDateString}\n </h2>`,u=M.workOrderMilestoneDateString);const s=document.createElement("div");s.className="panel-block is-block",!M.workOrderMilestoneCompletionDate&&""!==M.workOrderMilestoneDateString&&M.workOrderMilestoneDateString<p&&s.classList.add("has-background-warning-light");let O="";for(const s of M.workOrderLots)O+='<span class="has-tooltip-left" data-tooltip="'+cityssm.escapeHTML(null!==(r=s.mapName)&&void 0!==r?r:"")+'"><i class="fas fa-vector-square" aria-label="'+e.escapedAliases.Lot+'"></i> '+cityssm.escapeHTML(null!==(a=s.lotName)&&void 0!==a?a:"")+"</span><br />";for(const s of M.workOrderLotOccupancies)for(const r of s.lotOccupancyOccupants)O+='<span class="has-tooltip-left" data-tooltip="'+cityssm.escapeHTML(null!==(i=r.lotOccupantType)&&void 0!==i?i:"")+'"><i class="fas fa-user" aria-label="'+e.escapedAliases.Occupancy+'"></i> '+cityssm.escapeHTML(null!==(o=r.occupantName)&&void 0!==o?o:"")+" "+cityssm.escapeHTML(null!==(n=r.occupantFamilyName)&&void 0!==n?n:"")+"</span><br />";s.innerHTML='<div class="columns"><div class="column is-narrow"><span class="icon is-small">'+(M.workOrderMilestoneCompletionDate?'<i class="fas fa-check" aria-label="Completed"></i>':'<i class="far fa-square has-text-grey" aria-label="Incomplete"></i>')+'</span></div><div class="column">'+(0===M.workOrderMilestoneTime?"":M.workOrderMilestoneTimePeriodString+"<br />")+(M.workOrderMilestoneTypeId?"<strong>"+cityssm.escapeHTML(M.workOrderMilestoneType)+"</strong><br />":"")+'<span class="is-size-7">'+cityssm.escapeHTML(M.workOrderMilestoneDescription)+'</span></div><div class="column"><i class="fas fa-circle" style="color:'+e.getRandomColor(null!==(l=M.workOrderNumber)&&void 0!==l?l:"")+'" aria-hidden="true"></i> <a class="has-text-weight-bold" href="'+e.getWorkOrderURL(M.workOrderId)+'">'+cityssm.escapeHTML(null!==(c=M.workOrderNumber)&&void 0!==c?c:"")+'</a><br /><span class="is-size-7">'+cityssm.escapeHTML(null!==(d=M.workOrderDescription)&&void 0!==d?d:"")+'</span></div><div class="column is-size-7">'+O+"</div></div>",m.append(s)}t.append(m)}(s.workOrderMilestones)})}r.addEventListener("change",()=>{a.closest("fieldset").disabled="date"!==r.value,i()}),e.initializeDatePickers(s),a.addEventListener("change",i),s.addEventListener("submit",i),i()})();
|
||||
|
|
@ -240,11 +240,13 @@ export interface WorkOrderMilestone extends Record, WorkOrder {
|
|||
workOrderMilestoneDateString?: string;
|
||||
workOrderMilestoneTime?: number;
|
||||
workOrderMilestoneTimeString?: string;
|
||||
workOrderMilestoneTimePeriodString?: string;
|
||||
workOrderMilestoneDescription?: string;
|
||||
workOrderMilestoneCompletionDate?: number;
|
||||
workOrderMilestoneCompletionDateString?: string;
|
||||
workOrderMilestoneCompletionTime?: number;
|
||||
workOrderMilestoneCompletionTimeString?: string;
|
||||
workOrderMilestoneCompletionTimePeriodString?: string;
|
||||
workOrderRecordUpdate_timeMillis?: number;
|
||||
}
|
||||
export interface WorkOrder extends Record {
|
||||
|
|
|
|||
|
|
@ -319,6 +319,7 @@ export interface WorkOrderMilestone extends Record, WorkOrder {
|
|||
|
||||
workOrderMilestoneTime?: number
|
||||
workOrderMilestoneTimeString?: string
|
||||
workOrderMilestoneTimePeriodString?: string
|
||||
|
||||
workOrderMilestoneDescription?: string
|
||||
|
||||
|
|
@ -327,6 +328,7 @@ export interface WorkOrderMilestone extends Record, WorkOrder {
|
|||
|
||||
workOrderMilestoneCompletionTime?: number
|
||||
workOrderMilestoneCompletionTimeString?: string
|
||||
workOrderMilestoneCompletionTimePeriodString?: string
|
||||
|
||||
workOrderRecordUpdate_timeMillis?: number
|
||||
}
|
||||
|
|
|
|||
|
|
@ -48,7 +48,7 @@
|
|||
</span>
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneTime) { %>
|
||||
<%= milestone.workOrderMilestoneTimeString %><br />
|
||||
<%= milestone.workOrderMilestoneTimePeriodString %><br />
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneTypeId) { %>
|
||||
<strong><%= milestone.workOrderMilestoneType %></strong><br />
|
||||
|
|
|
|||
|
|
@ -46,22 +46,22 @@
|
|||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% for (const occupancy of workOrder.workOrderLotOccupancies) { %>
|
||||
<tr>
|
||||
<td><%= occupancy.occupancyType %></td>
|
||||
<td><%= occupancy.lotName %></td>
|
||||
<td><%= occupancy.occupancyStartDateString %></td>
|
||||
<td><%= occupancy.occupancyStartEndString %></td>
|
||||
<td>
|
||||
<% for (const occupant of occupancy.lotOccupancyOccupants) { %>
|
||||
<%= occupant.lotOccupantType %>:
|
||||
<%= occupant.occupantName %>
|
||||
<%= occupant.occupantFamilyName %>
|
||||
<br />
|
||||
<% } %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
<% for (const occupancy of workOrder.workOrderLotOccupancies) { %>
|
||||
<tr>
|
||||
<td><%= occupancy.occupancyType %></td>
|
||||
<td><%= occupancy.lotName %></td>
|
||||
<td><%= occupancy.occupancyStartDateString %></td>
|
||||
<td><%= occupancy.occupancyStartEndString %></td>
|
||||
<td>
|
||||
<% for (const occupant of occupancy.lotOccupancyOccupants) { %>
|
||||
<%= occupant.lotOccupantType %>:
|
||||
<%= occupant.occupantName %>
|
||||
<%= occupant.occupantFamilyName %>
|
||||
<br />
|
||||
<% } %>
|
||||
</td>
|
||||
</tr>
|
||||
<% } %>
|
||||
</tbody>
|
||||
</table>
|
||||
<% } %>
|
||||
|
|
@ -71,11 +71,11 @@
|
|||
|
||||
<table class="data-table">
|
||||
<thead>
|
||||
<tr>
|
||||
<th class="is-width-1"></th>
|
||||
<th>Milestone Description</th>
|
||||
<th>Due Date</th>
|
||||
</tr>
|
||||
<tr>
|
||||
<th class="is-width-1"></th>
|
||||
<th>Milestone Description</th>
|
||||
<th>Due Date</th>
|
||||
</tr>
|
||||
</thead>
|
||||
<tbody>
|
||||
<% for (const milestone of workOrder.workOrderMilestones) { %>
|
||||
|
|
@ -100,7 +100,7 @@
|
|||
<%= milestone.workOrderMilestoneDateString %>
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneTime) { %>
|
||||
<%= milestone.workOrderMilestoneTimeString %>
|
||||
<%= milestone.workOrderMilestoneTimePeriodString %>
|
||||
<% } %>
|
||||
</td>
|
||||
</tr>
|
||||
|
|
@ -116,8 +116,8 @@
|
|||
const recordCreateDate = new Date(workOrder.recordCreate_timeMillis);
|
||||
const currentDate = new Date();
|
||||
%>
|
||||
Work order created <%= dateTimeFunctions.dateToString(recordCreateDate) %> at <%= dateTimeFunctions.dateToTimeString(recordCreateDate) %>.
|
||||
Printed <%= dateTimeFunctions.dateToString(currentDate) %> at <%= dateTimeFunctions.dateToTimeString(currentDate) %>.<br />
|
||||
Work order created <%= dateTimeFunctions.dateToString(recordCreateDate) %> at <%= dateTimeFunctions.dateToTimePeriodString(recordCreateDate) %>.
|
||||
Printed <%= dateTimeFunctions.dateToString(currentDate) %> at <%= dateTimeFunctions.dateToTimePeriodString(currentDate) %>.<br />
|
||||
workOrderId = <%= workOrder.workOrderId %>
|
||||
</p>
|
||||
</body>
|
||||
|
|
|
|||
|
|
@ -340,19 +340,19 @@
|
|||
<% } %>
|
||||
</div>
|
||||
<div class="column">
|
||||
<% if (milestone.workOrderMilestoneTypeId) { %>
|
||||
<strong><%= milestone.workOrderMilestoneType %></strong><br />
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneDate === 0) { %>
|
||||
<span class="has-text-grey">(No Set Date)</span>
|
||||
<% } else { %>
|
||||
<%= milestone.workOrderMilestoneDateString %>
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneTime !== 0) { %>
|
||||
<%= milestone.workOrderMilestoneTimeString %>
|
||||
<% } %>
|
||||
<br />
|
||||
<span class="is-size-7"><%= milestone.workOrderMilestoneDescription %></span>
|
||||
<% if (milestone.workOrderMilestoneTypeId) { %>
|
||||
<strong><%= milestone.workOrderMilestoneType %></strong><br />
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneDate === 0) { %>
|
||||
<span class="has-text-grey">(No Set Date)</span>
|
||||
<% } else { %>
|
||||
<%= milestone.workOrderMilestoneDateString %>
|
||||
<% } %>
|
||||
<% if (milestone.workOrderMilestoneTime !== 0) { %>
|
||||
<%= milestone.workOrderMilestoneTimePeriodString %>
|
||||
<% } %>
|
||||
<br />
|
||||
<span class="is-size-7"><%= milestone.workOrderMilestoneDescription %></span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
|
|
|||
Loading…
Reference in New Issue