@websy/websy-designs 1.6.2 → 1.7.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -120,8 +120,9 @@ class AuthHelper {
120
120
  }
121
121
  })
122
122
  }
123
- isLoggedIn (req, res, next) {
124
- if (req.session && req.session.user && !req.session.user.isAnonymous) {
123
+ isLoggedIn (req, res, next) {
124
+ console.log(req.session)
125
+ if (req.session && req.session.user && req.session.user.isAnonymous !== true) {
125
126
  console.log('in condition D')
126
127
  next()
127
128
  }
@@ -341,6 +341,7 @@ class PGHelper {
341
341
  }
342
342
  execute (query) {
343
343
  return new Promise((resolve, reject) => {
344
+ // console.log(query)
344
345
  if (query !== null) {
345
346
  this.client.query(query, (err, queryResponse) => {
346
347
  if (err) {
@@ -1864,7 +1864,13 @@ class WebsyDropdown {
1864
1864
  }
1865
1865
  this.updateHeader(item)
1866
1866
  }
1867
- setValue (value) {
1867
+ get value () {
1868
+ if (this.selectedItems && this.selectedItems.length > 0) {
1869
+ return this.selectedItems.map((d, i) => this.options.items[+d])
1870
+ }
1871
+ return []
1872
+ }
1873
+ set value (value) {
1868
1874
  this.selectedItems = []
1869
1875
  if (Array.isArray(value)) {
1870
1876
  this.options.items.forEach(d => {
@@ -1976,6 +1982,9 @@ class WebsyDropdown {
1976
1982
  if (item && this.options.onItemSelected) {
1977
1983
  this.options.onItemSelected(item, this.selectedItems, dataToUse, this.options)
1978
1984
  }
1985
+ if (this.options.onChange) {
1986
+ this.options.onChange(this)
1987
+ }
1979
1988
  if (this.options.closeAfterSelection === true) {
1980
1989
  this.close()
1981
1990
  }
@@ -2011,7 +2020,9 @@ class WebsyForm {
2011
2020
  // if (this.options.classes) {
2012
2021
  // this.options.classes.forEach(c => el.classList.add(c))
2013
2022
  // }
2023
+ el.addEventListener('change', this.handleChange.bind(this))
2014
2024
  el.addEventListener('click', this.handleClick.bind(this))
2025
+ el.addEventListener('focusout', this.handleFocusOut.bind(this))
2015
2026
  el.addEventListener('keyup', this.handleKeyUp.bind(this))
2016
2027
  el.addEventListener('keydown', this.handleKeyDown.bind(this))
2017
2028
  this.render()
@@ -2067,15 +2078,18 @@ class WebsyForm {
2067
2078
  this.options.fields = []
2068
2079
  }
2069
2080
  for (let key in d) {
2070
- this.options.fields.forEach(f => {
2081
+ this.options.fields.forEach(f => {
2071
2082
  if (f.field === key) {
2072
- f.value = d[key]
2073
- const el = document.getElementById(`${this.elementId}_input_${f.field}`)
2074
- el.value = f.value
2083
+ this.setValue(key, d[key])
2084
+ // f.value = d[key]
2085
+ // const el = document.getElementById(`${this.elementId}_input_${f.field}`)
2086
+ // if (el) {
2087
+ // el.value = f.value
2088
+ // }
2075
2089
  }
2076
2090
  })
2077
2091
  }
2078
- this.render()
2092
+ // this.render()
2079
2093
  }
2080
2094
  confirmValidation () {
2081
2095
  const el = document.getElementById(`${this.elementId}_validationFail`)
@@ -2089,6 +2103,20 @@ class WebsyForm {
2089
2103
  el.innerHTML = msg
2090
2104
  }
2091
2105
  }
2106
+ handleChange (event) {
2107
+ if (event.target.getAttribute('data-user-type') === 'expiry') {
2108
+ if (event.target.value.length === 7) {
2109
+ let value = event.target.value.split('/')
2110
+ event.target.value = `${value[0]}/${value[1].substring(2, 4)}`
2111
+ }
2112
+ }
2113
+ if (event.target.classList.contains('websy-input')) {
2114
+ let index = event.target.getAttribute('data-index')
2115
+ if (this.options.fields[index] && (this.options.fields[index].required || this.options.fields[index].validate)) {
2116
+ this.validateField(this.options.fields[index], event.target.value)
2117
+ }
2118
+ }
2119
+ }
2092
2120
  handleClick (event) {
2093
2121
  if (event.target.classList.contains('submit')) {
2094
2122
  event.preventDefault()
@@ -2099,13 +2127,68 @@ class WebsyForm {
2099
2127
  this.cancelForm()
2100
2128
  }
2101
2129
  }
2130
+ handleFocusOut (event) {
2131
+ if (event.target.classList.contains('websy-input')) {
2132
+ let index = event.target.getAttribute('data-index')
2133
+ if (this.options.fields[index] && (this.options.fields[index].required || this.options.fields[index].validate)) {
2134
+ this.validateField(this.options.fields[index], event.target.value)
2135
+ }
2136
+ }
2137
+ }
2102
2138
  handleKeyDown (event) {
2103
2139
  if (event.key === 'enter') {
2104
2140
  this.submitForm()
2105
2141
  }
2142
+ if (event.target.getAttribute('data-user-type') === 'expiry') {
2143
+ let isNumeric = !isNaN(event.key)
2144
+ let validKey = false
2145
+ if (!validKey) {
2146
+ validKey = ['ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Tab'].indexOf(event.key) !== -1
2147
+ }
2148
+ if ((event.target.value.length === 5 && !validKey) || (!validKey && !isNumeric)) {
2149
+ event.preventDefault()
2150
+ return false
2151
+ }
2152
+ if (event.key === 'Backspace') {
2153
+ if (event.target.value.indexOf('/') === event.target.selectionStart - 1) {
2154
+ let chars = event.target.value.split('')
2155
+ chars.pop()
2156
+ event.target.value = chars.join('')
2157
+ }
2158
+ }
2159
+ }
2160
+ if (event.target.getAttribute('data-user-type') === 'cvv') {
2161
+ let isNumeric = !isNaN(event.key)
2162
+ let validKey = false
2163
+ if (!validKey) {
2164
+ validKey = ['ArrowLeft', 'ArrowRight', 'Backspace', 'Delete', 'Tab'].indexOf(event.key) !== -1
2165
+ }
2166
+ if ((event.target.value.length === 3 && !validKey) || (!validKey && !isNumeric)) {
2167
+ event.preventDefault()
2168
+ return false
2169
+ }
2170
+ }
2106
2171
  }
2107
2172
  handleKeyUp (event) {
2108
-
2173
+ if (event.target.getAttribute('data-user-type') === 'expiry') {
2174
+ let chars = event.target.value.split('')
2175
+ let isNumeric = !isNaN(event.key)
2176
+ if (event.key === 'Backspace') {
2177
+ if (chars[chars.length - 1] === '/' && chars.length !== 3) {
2178
+ chars.pop()
2179
+ event.target.value = chars.join('')
2180
+ return
2181
+ }
2182
+ }
2183
+ if (event.target.selectionStart === 2) {
2184
+ if (chars[2] && ['ArrowLeft', 'ArrowRight', 'Backspace', 'Delete'].indexOf(event.key) === -1) {
2185
+ event.target.setSelectionRange(3, 3)
2186
+ }
2187
+ else if (isNumeric) {
2188
+ event.target.value += '/'
2189
+ }
2190
+ }
2191
+ }
2109
2192
  }
2110
2193
  processComponents (components, callbackFn) {
2111
2194
  if (components.length === 0) {
@@ -2114,6 +2197,13 @@ class WebsyForm {
2114
2197
  else {
2115
2198
  components.forEach(c => {
2116
2199
  if (typeof WebsyDesigns[c.component] !== 'undefined') {
2200
+ if (!c.options.onChange) {
2201
+ c.options.onChange = () => {
2202
+ if (c.required || c.validate) {
2203
+ this.validateField(c, c.instance.value)
2204
+ }
2205
+ }
2206
+ }
2117
2207
  c.instance = new WebsyDesigns[c.component](`${this.elementId}_input_${c.field}_component`, c.options)
2118
2208
  }
2119
2209
  else {
@@ -2145,35 +2235,41 @@ class WebsyForm {
2145
2235
  if (f.component) {
2146
2236
  componentsToProcess.push(f)
2147
2237
  html += `
2148
- ${i > 0 ? '-->' : ''}<div class='${f.classes || ''}'>
2149
- ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}
2238
+ ${i > 0 ? '-->' : ''}<div id='${this.elementId}_${f.field}_inputContainer' class='websy-input-container ${f.classes || ''}'>
2239
+ ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}${f.required === true ? '<span class="websy-form-required-value">*</span>' : ''}
2150
2240
  <div id='${this.elementId}_input_${f.field}_component' class='form-component'></div>
2241
+ <span id='${this.elementId}_${f.field}_error' class='websy-form-validation-error'></span>
2151
2242
  </div><!--
2152
2243
  `
2153
2244
  }
2154
2245
  else if (f.type === 'longtext') {
2155
2246
  html += `
2156
- ${i > 0 ? '-->' : ''}<div class='${f.classes || ''}'>
2157
- ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}
2247
+ ${i > 0 ? '-->' : ''}<div id='${this.elementId}_${f.field}_inputContainer' class='websy-input-container ${f.classes || ''}'>
2248
+ ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}${f.required === true ? '<span class="websy-form-required-value">*</span>' : ''}
2158
2249
  <textarea
2159
2250
  id="${this.elementId}_input_${f.field}"
2160
2251
  ${f.required === true ? 'required' : ''}
2161
2252
  placeholder="${f.placeholder || ''}"
2253
+ data-user-type="${f.type}"
2254
+ data-index="${i}"
2162
2255
  name="${f.field}"
2163
2256
  ${(f.attributes || []).join(' ')}
2164
2257
  class="websy-input websy-textarea"
2165
2258
  ></textarea>
2259
+ <span id='${this.elementId}_${f.field}_error' class='websy-form-validation-error'></span>
2166
2260
  </div><!--
2167
2261
  `
2168
2262
  }
2169
2263
  else {
2170
2264
  html += `
2171
- ${i > 0 ? '-->' : ''}<div class='${f.classes || ''}'>
2172
- ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}
2265
+ ${i > 0 ? '-->' : ''}<div id='${this.elementId}_${f.field}_inputContainer' class='websy-input-container ${f.classes || ''}'>
2266
+ ${f.label ? `<label for="${f.field}">${f.label}</label>` : ''}${f.required === true ? '<span class="websy-form-required-value">*</span>' : ''}
2173
2267
  <input
2174
2268
  id="${this.elementId}_input_${f.field}"
2175
2269
  ${f.required === true ? 'required' : ''}
2176
- type="${f.type || 'text'}"
2270
+ type="${(f.type === 'expiry' ? 'text' : f.type === 'cvv' ? 'number' : f.type) || 'text'}"
2271
+ data-user-type="${f.type}"
2272
+ data-index="${i}"
2177
2273
  class="websy-input"
2178
2274
  ${(f.attributes || []).join(' ')}
2179
2275
  name="${f.field}"
@@ -2182,6 +2278,7 @@ class WebsyForm {
2182
2278
  valueAsDate="${f.type === 'date' ? f.value : ''}"
2183
2279
  oninvalidx="this.setCustomValidity('${f.invalidMessage || 'Please fill in this field.'}')"
2184
2280
  />
2281
+ <span id='${this.elementId}_${f.field}_error' class='websy-form-validation-error'></span>
2185
2282
  </div><!--
2186
2283
  `
2187
2284
  }
@@ -2215,7 +2312,7 @@ class WebsyForm {
2215
2312
  setValue (field, value) {
2216
2313
  if (this.fieldMap[field]) {
2217
2314
  if (this.fieldMap[field].instance) {
2218
- this.fieldMap[field].instance.setValue(value)
2315
+ this.fieldMap[field].instance.value = value
2219
2316
  }
2220
2317
  else {
2221
2318
  const el = document.getElementById(`${this.elementId}_input_${field}`)
@@ -2235,7 +2332,10 @@ class WebsyForm {
2235
2332
  const formEl = document.getElementById(`${this.elementId}Form`)
2236
2333
  const buttonEl = formEl.querySelector('button.websy-btn.submit')
2237
2334
  const recaptchErrEl = document.getElementById(`${this.elementId}_recaptchaError`)
2238
- if (formEl.reportValidity() === true) {
2335
+ if (this.options.preSubmitFn && this.options.preSubmitFn() === false) {
2336
+ return
2337
+ }
2338
+ if (this.validateForm() === true) {
2239
2339
  if (buttonEl) {
2240
2340
  buttonEl.setAttribute('disabled', true)
2241
2341
  }
@@ -2293,6 +2393,59 @@ class WebsyForm {
2293
2393
  })
2294
2394
  }
2295
2395
  }
2396
+ validateForm () {
2397
+ let valid = true
2398
+ let data = this.data
2399
+ for (let i = 0; i < this.options.fields.length; i++) {
2400
+ if (this.options.fields[i].required || this.options.fields[i].validate) {
2401
+ if (this.validateField(this.options.fields[i], data[this.options.fields[i].field]) === false) {
2402
+ valid = false
2403
+ }
2404
+ }
2405
+ }
2406
+ return valid
2407
+ }
2408
+ validateField (field, value) {
2409
+ const inputContainerEl = document.getElementById(`${this.elementId}_${field.field}_inputContainer`)
2410
+ const errorEl = document.getElementById(`${this.elementId}_${field.field}_error`)
2411
+ if (field.required) {
2412
+ let valid = true
2413
+ if (field.component && field.instance && field.instance.value) {
2414
+ valid = field.instance.value.length > 0
2415
+ }
2416
+ else {
2417
+ valid = !(typeof value === 'undefined' || value === '')
2418
+ }
2419
+ if (!valid) {
2420
+ if (errorEl) {
2421
+ errorEl.innerHTML = field.invalidMessage || 'A value is required'
2422
+ }
2423
+ if (inputContainerEl) {
2424
+ inputContainerEl.classList.add('websy-form-input-has-error')
2425
+ }
2426
+ return false
2427
+ }
2428
+ }
2429
+ if (field.validate) {
2430
+ let valid = field.validate(field, value)
2431
+ if (!valid) {
2432
+ if (errorEl) {
2433
+ errorEl.innerHTML = field.invalidMessage || 'A value is required'
2434
+ }
2435
+ if (inputContainerEl) {
2436
+ inputContainerEl.classList.add('websy-form-input-has-error')
2437
+ }
2438
+ return false
2439
+ }
2440
+ }
2441
+ if (errorEl) {
2442
+ errorEl.innerHTML = ''
2443
+ }
2444
+ if (inputContainerEl) {
2445
+ inputContainerEl.classList.remove('websy-form-input-has-error')
2446
+ }
2447
+ return true
2448
+ }
2296
2449
  validateRecaptcha (token) {
2297
2450
  this.recaptchaValue = token
2298
2451
  }
@@ -2485,24 +2638,26 @@ class WebsyLoadingDialog {
2485
2638
  return
2486
2639
  }
2487
2640
  const el = document.getElementById(this.elementId)
2488
- let html = `
2489
- <div class='websy-loading-container ${(this.options.classes || []).join(' ')}'>
2490
- <div class='websy-ripple'>
2491
- <div></div>
2492
- <div></div>
2493
- </div>
2494
- <h4>${this.options.title || 'Loading...'}</h4>
2495
- `
2496
- if (this.options.messages) {
2497
- for (let i = 0; i < this.options.messages.length; i++) {
2498
- html += `<p>${this.options.messages[i]}</p>`
2499
- }
2500
- }
2501
- html += `
2502
- </div>
2503
- `
2504
- el.classList.add('loading')
2505
- el.innerHTML = html
2641
+ if (el) {
2642
+ let html = `
2643
+ <div class='websy-loading-container ${(this.options.classes || []).join(' ')}'>
2644
+ <div class='websy-ripple'>
2645
+ <div></div>
2646
+ <div></div>
2647
+ </div>
2648
+ <h4>${this.options.title || 'Loading...'}</h4>
2649
+ `
2650
+ if (this.options.messages) {
2651
+ for (let i = 0; i < this.options.messages.length; i++) {
2652
+ html += `<p>${this.options.messages[i]}</p>`
2653
+ }
2654
+ }
2655
+ html += `
2656
+ </div>
2657
+ `
2658
+ el.classList.add('loading')
2659
+ el.innerHTML = html
2660
+ }
2506
2661
  }
2507
2662
  show (options, override = false) {
2508
2663
  if (options) {
@@ -3853,6 +4008,7 @@ class WebsyRouter {
3853
4008
  output.items = Object.assign({}, params)
3854
4009
  path = this.buildUrlPath(output.items)
3855
4010
  }
4011
+ output.path = path
3856
4012
  this.currentParams = output
3857
4013
  let inputPath = this.currentView
3858
4014
  if (this.options.urlPrefix) {
@@ -3865,13 +4021,13 @@ class WebsyRouter {
3865
4021
  // this.showView(this.currentView, this.currentParams, 'main')
3866
4022
  this.navigate(`${inputPath}?${path}`, 'main', null, noHistory)
3867
4023
  }
4024
+ else {
4025
+ this.updateHistory(inputPath, !noHistory, true)
4026
+ }
3868
4027
  }
3869
4028
  removeUrlParams (params = [], reloadView = false, noHistory = true) {
3870
4029
  this.previousParams = Object.assign({}, this.currentParams)
3871
- const output = {
3872
- path: '',
3873
- items: {}
3874
- }
4030
+
3875
4031
  let path = ''
3876
4032
  if (this.currentParams && this.currentParams.items) {
3877
4033
  params.forEach(p => {
@@ -3887,6 +4043,13 @@ class WebsyRouter {
3887
4043
  // this.showView(this.currentView, this.currentParams, 'main')
3888
4044
  this.navigate(`${inputPath}?${path}`, 'main', null, noHistory)
3889
4045
  }
4046
+ else if (noHistory === false) {
4047
+ this.currentParams = {
4048
+ items: this.currentParams.items,
4049
+ path
4050
+ }
4051
+ this.updateHistory(inputPath, !noHistory, true)
4052
+ }
3890
4053
  }
3891
4054
  removeAllUrlParams (reloadView = false, noHistory = true) {
3892
4055
  // const output = {
@@ -3901,14 +4064,12 @@ class WebsyRouter {
3901
4064
  this.currentParams = {
3902
4065
  path: '',
3903
4066
  items: {}
3904
- }
4067
+ }
3905
4068
  if (reloadView === true) {
3906
4069
  this.navigate(`${inputPath}`, 'main', null, noHistory)
3907
4070
  }
3908
4071
  else {
3909
- history.replaceState({
3910
- inputPath
3911
- }, 'unused', inputPath)
4072
+ this.updateHistory(inputPath, !noHistory, true)
3912
4073
  }
3913
4074
  }
3914
4075
  buildUrlPath (params) {
@@ -4183,6 +4344,9 @@ class WebsyRouter {
4183
4344
  }
4184
4345
  }
4185
4346
  showView (view, params, group) {
4347
+ if (view === '/' || view === '') {
4348
+ view = this.options.defaultView || ''
4349
+ }
4186
4350
  this.activateItem(view, this.options.triggerClass)
4187
4351
  this.activateItem(view, this.options.viewClass)
4188
4352
  let children = this.getActiveViewsFromParent(view)
@@ -4307,28 +4471,7 @@ class WebsyRouter {
4307
4471
  }
4308
4472
  if ((this.currentPath !== inputPath || previousParamsPath !== this.currentParams.path) && group === this.options.defaultGroup) {
4309
4473
  let historyUrl = inputPath
4310
- if (this.options.urlPrefix) {
4311
- historyUrl = historyUrl === '/' ? '' : `/${historyUrl}`
4312
- inputPath = inputPath === '/' ? '' : `/${inputPath}`
4313
- historyUrl = (`/${this.options.urlPrefix}${historyUrl}`).replace(/\/\//g, '/')
4314
- inputPath = (`/${this.options.urlPrefix}${inputPath}`).replace(/\/\//g, '/')
4315
- }
4316
- if (this.currentParams && this.currentParams.path) {
4317
- historyUrl += `?${this.currentParams.path}`
4318
- }
4319
- else if (this.queryParams && this.options.persistentParameters === true) {
4320
- historyUrl += `?${this.queryParams}`
4321
- }
4322
- if (popped === false) {
4323
- history.pushState({
4324
- inputPath: historyUrl
4325
- }, 'unused', historyUrl)
4326
- }
4327
- else {
4328
- history.replaceState({
4329
- inputPath: historyUrl
4330
- }, 'unused', historyUrl)
4331
- }
4474
+ this.updateHistory(historyUrl, popped)
4332
4475
  }
4333
4476
  if (toggle === false) {
4334
4477
  this.showView(newPath.split('?')[0], this.currentParams, group)
@@ -4363,6 +4506,28 @@ class WebsyRouter {
4363
4506
  item.apply(null, params)
4364
4507
  })
4365
4508
  }
4509
+ updateHistory (historyUrl, replaceState = false, overridePersistent = false) {
4510
+ if (this.options.urlPrefix) {
4511
+ historyUrl = historyUrl === '/' ? '' : `/${historyUrl}`
4512
+ historyUrl = (`/${this.options.urlPrefix}${historyUrl}`).replace(/\/\//g, '/')
4513
+ }
4514
+ if ((this.currentParams && this.currentParams.path) || overridePersistent === true) {
4515
+ historyUrl += `?${this.currentParams.path}`
4516
+ }
4517
+ else if (this.queryParams && this.options.persistentParameters === true) {
4518
+ historyUrl += `?${this.queryParams}`
4519
+ }
4520
+ if (replaceState === false) {
4521
+ history.pushState({
4522
+ inputPath: historyUrl
4523
+ }, 'unused', historyUrl)
4524
+ }
4525
+ else {
4526
+ history.replaceState({
4527
+ inputPath: historyUrl
4528
+ }, 'unused', historyUrl)
4529
+ }
4530
+ }
4366
4531
  subscribe (event, fn) {
4367
4532
  this.options.subscribers[event].push(fn)
4368
4533
  }
@@ -5902,7 +6067,7 @@ class WebsyTable3 {
5902
6067
  return ''
5903
6068
  }
5904
6069
  let bodyHtml = ``
5905
- let sizingColumns = this.options.columns[this.options.columns.length - 1]
6070
+ let sizingColumns = this.options.columns[this.options.columns.length - 1].filter(c => c.show !== false)
5906
6071
  if (useWidths === true) {
5907
6072
  bodyHtml += '<colgroup>'
5908
6073
  bodyHtml += sizingColumns.map(c => `
@@ -5914,9 +6079,9 @@ class WebsyTable3 {
5914
6079
  }
5915
6080
  data.forEach((row, rowIndex) => {
5916
6081
  bodyHtml += `<tr class="websy-table-row">`
5917
- row.forEach((cell, cellIndex) => {
6082
+ row.forEach((cell, cellIndex) => {
5918
6083
  let sizeIndex = cell.level || cellIndex
5919
- if (typeof sizingColumns[sizeIndex] === 'undefined') {
6084
+ if (typeof sizingColumns[sizeIndex] === 'undefined' || sizingColumns[sizeIndex].show === false) {
5920
6085
  return // need to revisit this logic
5921
6086
  }
5922
6087
  let style = ''
@@ -6013,7 +6178,7 @@ class WebsyTable3 {
6013
6178
  return ''
6014
6179
  }
6015
6180
  let headerHtml = ''
6016
- let sizingColumns = this.options.columns[this.options.columns.length - 1]
6181
+ let sizingColumns = this.options.columns[this.options.columns.length - 1].filter(c => c.show !== false)
6017
6182
  if (useWidths === true) {
6018
6183
  headerHtml += '<colgroup>'
6019
6184
  headerHtml += sizingColumns.map(c => `
@@ -6029,7 +6194,10 @@ class WebsyTable3 {
6029
6194
  return
6030
6195
  }
6031
6196
  headerHtml += `<tr class="websy-table-row websy-table-header-row">`
6032
- row.forEach((col, colIndex) => {
6197
+ row.filter(c => c.show !== false).forEach((col, colIndex) => {
6198
+ if (typeof sizingColumns[colIndex] === 'undefined' || sizingColumns[colIndex].show === false) {
6199
+ return // need to revisit this logic
6200
+ }
6033
6201
  let style = `width: ${sizingColumns[colIndex].width || sizingColumns[colIndex].actualWidth}px!important; `
6034
6202
  let divStyle = style
6035
6203
  if (useWidths === true) {
@@ -6093,8 +6261,12 @@ class WebsyTable3 {
6093
6261
  if (!this.options.totals) {
6094
6262
  return ''
6095
6263
  }
6264
+ let sizingColumns = this.options.columns[this.options.columns.length - 1].filter(c => c.show !== false)
6096
6265
  let totalHtml = `<tr class="websy-table-row websy-table-total-row">`
6097
6266
  this.options.totals.forEach((col, colIndex) => {
6267
+ if (typeof sizingColumns[colIndex] === 'undefined' || sizingColumns[colIndex].show === false) {
6268
+ return // need to revisit this logic
6269
+ }
6098
6270
  totalHtml += `<td
6099
6271
  class='websy-table-cell ${(col.classes || []).join(' ')}'
6100
6272
  colspan='${col.colspan || 1}'
@@ -6150,36 +6322,37 @@ class WebsyTable3 {
6150
6322
  let totalWidth = 0
6151
6323
  this.sizes.scrollableWidth = this.sizes.outer.width
6152
6324
  let firstNonPinnedColumnWidth = 0
6325
+ let columnsForSizing = this.options.columns[this.options.columns.length - 1].filter(c => c.show !== false)
6153
6326
  rows.forEach((row, rowIndex) => {
6154
6327
  Array.from(row.children).forEach((col, colIndex) => {
6155
6328
  let colSize = col.getBoundingClientRect()
6156
6329
  this.sizes.cellHeight = colSize.height
6157
- if (this.options.columns[this.options.columns.length - 1][colIndex]) {
6158
- if (!this.options.columns[this.options.columns.length - 1][colIndex].actualWidth) {
6159
- this.options.columns[this.options.columns.length - 1][colIndex].actualWidth = 0
6330
+ if (columnsForSizing[colIndex]) {
6331
+ if (!columnsForSizing[colIndex].actualWidth) {
6332
+ columnsForSizing[colIndex].actualWidth = 0
6160
6333
  }
6161
- this.options.columns[this.options.columns.length - 1][colIndex].actualWidth = Math.min(Math.max(this.options.columns[this.options.columns.length - 1][colIndex].actualWidth, colSize.width), maxWidth)
6162
- this.options.columns[this.options.columns.length - 1][colIndex].cellHeight = colSize.height
6334
+ columnsForSizing[colIndex].actualWidth = Math.min(Math.max(columnsForSizing[colIndex].actualWidth, colSize.width), maxWidth)
6335
+ columnsForSizing[colIndex].cellHeight = colSize.height
6163
6336
  if (colIndex >= this.pinnedColumns) {
6164
- firstNonPinnedColumnWidth = this.options.columns[this.options.columns.length - 1][colIndex].actualWidth
6337
+ firstNonPinnedColumnWidth = columnsForSizing[colIndex].actualWidth
6165
6338
  }
6166
6339
  }
6167
6340
  })
6168
6341
  })
6169
- this.options.columns[this.options.columns.length - 1].forEach((col, colIndex) => {
6170
- if (colIndex < this.pinnedColumns) {
6171
- this.sizes.scrollableWidth -= col.actualWidth
6172
- }
6173
- })
6174
- this.sizes.totalWidth = this.options.columns[this.options.columns.length - 1].reduce((a, b) => a + (b.width || b.actualWidth), 0)
6175
- this.sizes.totalNonPinnedWidth = this.options.columns[this.options.columns.length - 1].filter((c, i) => i >= this.pinnedColumns).reduce((a, b) => a + (b.width || b.actualWidth), 0)
6342
+ // columnsForSizing.forEach((col, colIndex) => {
6343
+ // if (colIndex < this.pinnedColumns) {
6344
+ // this.sizes.scrollableWidth -= col.actualWidth
6345
+ // }
6346
+ // })
6347
+ this.sizes.totalWidth = columnsForSizing.reduce((a, b) => a + (b.width || b.actualWidth), 0)
6348
+ this.sizes.totalNonPinnedWidth = columnsForSizing.filter((c, i) => i >= this.pinnedColumns).reduce((a, b) => a + (b.width || b.actualWidth), 0)
6176
6349
  this.sizes.pinnedWidth = this.sizes.totalWidth - this.sizes.totalNonPinnedWidth
6177
6350
  // const outerSize = outerEl.getBoundingClientRect()
6178
6351
  if (this.sizes.totalWidth < this.sizes.outer.width) {
6179
- let equalWidth = (this.sizes.outer.width - this.sizes.totalWidth) / this.options.columns[this.options.columns.length - 1].length
6352
+ let equalWidth = (this.sizes.outer.width - this.sizes.totalWidth) / columnsForSizing.length
6180
6353
  this.sizes.totalWidth = 0
6181
6354
  this.sizes.totalNonPinnedWidth = 0
6182
- this.options.columns[this.options.columns.length - 1].forEach((c, i) => {
6355
+ columnsForSizing.forEach((c, i) => {
6183
6356
  // if (!c.width) {
6184
6357
  // if (c.actualWidth < equalWidth) {
6185
6358
  // adjust the width
@@ -6190,7 +6363,7 @@ class WebsyTable3 {
6190
6363
  // }
6191
6364
  // }
6192
6365
  this.sizes.totalWidth += c.width || c.actualWidth
6193
- if (i < this.pinnedColumns) {
6366
+ if (i > this.pinnedColumns) {
6194
6367
  this.sizes.totalNonPinnedWidth += c.width || c.actualWidth
6195
6368
  }
6196
6369
  // equalWidth = (outerSize.width - this.sizes.totalWidth) / (this.options.columns[this.options.columns.length - 1].length - (i + 1))
@@ -6200,17 +6373,21 @@ class WebsyTable3 {
6200
6373
  if (this.sizes.pinnedWidth > (this.sizes.outer.width - firstNonPinnedColumnWidth)) {
6201
6374
  this.sizes.totalWidth = 0
6202
6375
  let diff = this.sizes.pinnedWidth - (this.sizes.outer.width - firstNonPinnedColumnWidth)
6376
+ let oldPinnedWidth = this.sizes.pinnedWidth
6377
+ this.sizes.pinnedWidth = 0
6203
6378
  // let colDiff = diff / this.pinnedColumns
6204
- for (let i = 0; i < this.options.columns[this.options.columns.length - 1].length; i++) {
6379
+ for (let i = 0; i < columnsForSizing.length; i++) {
6205
6380
  if (i < this.pinnedColumns) {
6206
- let colDiff = (this.options.columns[this.options.columns.length - 1][i].actualWidth / this.sizes.pinnedWidth) * diff
6207
- this.options.columns[this.options.columns.length - 1][i].actualWidth -= colDiff
6381
+ let colDiff = (columnsForSizing[i].actualWidth / oldPinnedWidth) * diff
6382
+ columnsForSizing[i].actualWidth -= colDiff
6383
+ this.sizes.pinnedWidth += columnsForSizing[i].actualWidth
6208
6384
  }
6209
- this.sizes.totalWidth += this.options.columns[this.options.columns.length - 1][i].width || this.options.columns[this.options.columns.length - 1][i].actualWidth
6385
+ this.sizes.totalWidth += columnsForSizing[i].width || columnsForSizing[i].actualWidth
6210
6386
  }
6211
6387
  }
6212
6388
  // take the height of the last cell as the official height for data cells
6213
6389
  // this.sizes.dataCellHeight = this.options.columns[this.options.columns.length - 1].cellHeight
6390
+ this.sizes.scrollableWidth = this.sizes.table.width - this.sizes.pinnedWidth
6214
6391
  headEl.innerHTML = ''
6215
6392
  bodyEl.innerHTML = ''
6216
6393
  footerEl.innerHTML = ''
@@ -6520,18 +6697,21 @@ class WebsyTable3 {
6520
6697
  this.startCol = 0
6521
6698
  this.endCol = 0
6522
6699
  for (let i = this.pinnedColumns; i < this.options.allColumns[this.options.allColumns.length - 1].length; i++) {
6523
- cumulativeWidth += this.options.allColumns[this.options.allColumns.length - 1][i].actualWidth
6524
- // console.log('actualLeft', actualLeft, this.sizes.totalWidth, cumulativeWidth, cumulativeWidth + this.options.allColumns[this.options.allColumns.length - 1][i].actualWidth)
6525
- if (actualLeft < cumulativeWidth) {
6526
- this.startCol = i
6527
- break
6528
- }
6700
+ if (this.options.allColumns[this.options.allColumns.length - 1][i].show !== false) {
6701
+ cumulativeWidth += this.options.allColumns[this.options.allColumns.length - 1][i].actualWidth
6702
+ if (actualLeft < cumulativeWidth) {
6703
+ this.startCol = i
6704
+ break
6705
+ }
6706
+ }
6529
6707
  }
6530
6708
  cumulativeWidth = 0
6531
6709
  for (let i = this.startCol; i < this.options.allColumns[this.options.allColumns.length - 1].length; i++) {
6532
- cumulativeWidth += this.options.allColumns[this.options.allColumns.length - 1][i].actualWidth
6533
- if (cumulativeWidth < this.sizes.scrollableWidth) {
6534
- this.endCol = i
6710
+ if (this.options.allColumns[this.options.allColumns.length - 1][i].show !== false) {
6711
+ cumulativeWidth += this.options.allColumns[this.options.allColumns.length - 1][i].actualWidth
6712
+ if (cumulativeWidth < this.sizes.scrollableWidth) {
6713
+ this.endCol = i
6714
+ }
6535
6715
  }
6536
6716
  }
6537
6717
  if (this.endCol < this.options.allColumns[this.options.allColumns.length - 1].length - 1) {