icfs 0.1.3 → 0.2.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.
Files changed (42) hide show
  1. checksums.yaml +4 -4
  2. data/bin/icfs_demo_fcgi.rb +2 -0
  3. data/{bin/icfs_demo_ssl_gen.rb → devel/demo/ssl_gen.rb} +25 -13
  4. data/devel/demo/ssl_gen.yml +14 -0
  5. data/devel/icfs-wrk/Dockerfile +1 -1
  6. data/devel/run/base.rb +92 -0
  7. data/devel/run/copy-s3.rb +2 -0
  8. data/devel/run/email.rb +36 -0
  9. data/devel/run/email_imap.rb +43 -0
  10. data/devel/run/email_smime.rb +47 -0
  11. data/devel/run/init-icfs.rb +2 -0
  12. data/devel/run/webrick.rb +5 -57
  13. data/lib/icfs/api.rb +101 -90
  14. data/lib/icfs/cache.rb +2 -0
  15. data/lib/icfs/cache_elastic.rb +127 -125
  16. data/lib/icfs/{web/config.rb → config.rb} +3 -3
  17. data/lib/icfs/{web/config_redis.rb → config_redis.rb} +8 -8
  18. data/lib/icfs/{web/config_s3.rb → config_s3.rb} +8 -8
  19. data/lib/icfs/demo/auth.rb +5 -7
  20. data/lib/icfs/demo/static.rb +2 -0
  21. data/lib/icfs/elastic.rb +10 -8
  22. data/lib/icfs/email/basic.rb +242 -0
  23. data/lib/icfs/email/core.rb +293 -0
  24. data/lib/icfs/email/from.rb +52 -0
  25. data/lib/icfs/email/imap.rb +148 -0
  26. data/lib/icfs/email/smime.rb +139 -0
  27. data/lib/icfs/items.rb +5 -3
  28. data/lib/icfs/store.rb +20 -18
  29. data/lib/icfs/store_fs.rb +7 -5
  30. data/lib/icfs/store_s3.rb +4 -2
  31. data/lib/icfs/users.rb +5 -3
  32. data/lib/icfs/users_fs.rb +8 -6
  33. data/lib/icfs/users_redis.rb +12 -10
  34. data/lib/icfs/users_s3.rb +6 -4
  35. data/lib/icfs/utils/backup.rb +30 -29
  36. data/lib/icfs/utils/check.rb +36 -34
  37. data/lib/icfs/validate.rb +24 -15
  38. data/lib/icfs/web/auth_ssl.rb +7 -9
  39. data/lib/icfs/web/client.rb +671 -679
  40. data/lib/icfs.rb +174 -10
  41. metadata +16 -7
  42. data/devel/devel-webrick.yml +0 -49
@@ -9,6 +9,8 @@
9
9
  # This program is distributed WITHOUT ANY WARRANTY; without even the
10
10
  # implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
11
11
 
12
+ # frozen_string_literal: true
13
+
12
14
  require 'rack'
13
15
 
14
16
  module ICFS
@@ -47,7 +49,7 @@ class Client
47
49
  if path.empty?
48
50
  cmps = ['']
49
51
  else
50
- cmps = path.split('/'.freeze, -1)
52
+ cmps = path.split('/', -1)
51
53
  cmps.shift if cmps[0].empty?
52
54
  cmps = [''] if cmps.empty?
53
55
  end
@@ -61,8 +63,8 @@ class Client
61
63
  # search
62
64
  when 'case_search'
63
65
  return _call_search(env,
64
- 'Case Search'.freeze,
65
- 'Case Search'.freeze,
66
+ 'Case Search',
67
+ 'Case Search',
66
68
  QueryCase,
67
69
  ListCase,
68
70
  :case_search,
@@ -71,8 +73,8 @@ class Client
71
73
 
72
74
  when 'entry_search'
73
75
  return _call_search(env,
74
- 'Entry Search'.freeze,
75
- 'Entry Search'.freeze,
76
+ 'Entry Search',
77
+ 'Entry Search',
76
78
  QueryEntry,
77
79
  ListEntry,
78
80
  :entry_search,
@@ -81,8 +83,8 @@ class Client
81
83
 
82
84
  when 'log_search'
83
85
  return _call_search(env,
84
- 'Log Search'.freeze,
85
- 'Log Search'.freeze,
86
+ 'Log Search',
87
+ 'Log Search',
86
88
  QueryLog,
87
89
  ListLog,
88
90
  :log_search,
@@ -91,8 +93,8 @@ class Client
91
93
 
92
94
  when 'action_search'
93
95
  return _call_search(env,
94
- 'Action Search'.freeze,
95
- 'Action Search'.freeze,
96
+ 'Action Search',
97
+ 'Action Search',
96
98
  QueryAction,
97
99
  ListAction,
98
100
  :action_search,
@@ -101,8 +103,8 @@ class Client
101
103
 
102
104
  when 'index_search'
103
105
  return _call_search(env,
104
- 'Index Search'.freeze,
105
- 'Index Search'.freeze,
106
+ 'Index Search',
107
+ 'Index Search',
106
108
  QueryIndex,
107
109
  ListIndex,
108
110
  :index_search,
@@ -114,8 +116,8 @@ class Client
114
116
  # aggregations
115
117
  when 'stats'
116
118
  return _call_search(env,
117
- 'Stats Search'.freeze,
118
- 'Stats Search'.freeze,
119
+ 'Stats Search',
120
+ 'Stats Search',
119
121
  QueryStats,
120
122
  ListStats,
121
123
  :stats,
@@ -124,8 +126,8 @@ class Client
124
126
 
125
127
  when 'case_tags'
126
128
  return _call_search(env,
127
- 'Case Tags'.freeze,
128
- 'Case Tags Search'.freeze,
129
+ 'Case Tags',
130
+ 'Case Tags Search',
129
131
  QueryCaseTags,
130
132
  ListCaseTags,
131
133
  :case_tags,
@@ -134,8 +136,8 @@ class Client
134
136
 
135
137
  when 'entry_tags'
136
138
  return _call_search(env,
137
- 'Entry Tags'.freeze,
138
- 'Entry Tag Search'.freeze,
139
+ 'Entry Tags',
140
+ 'Entry Tag Search',
139
141
  QueryEntryTags,
140
142
  ListEntryTags,
141
143
  :entry_tags,
@@ -144,8 +146,8 @@ class Client
144
146
 
145
147
  when 'action_tags'
146
148
  return _call_search(env,
147
- 'Action Tags'.freeze,
148
- 'Action Tag Search'.freeze,
149
+ 'Action Tags',
150
+ 'Action Tag Search',
149
151
  QueryActionTags,
150
152
  ListActionTags,
151
153
  :action_tags,
@@ -154,8 +156,8 @@ class Client
154
156
 
155
157
  when 'index_tags'
156
158
  return _call_search(env,
157
- 'Index Tags'.freeze,
158
- 'Index Tag Search'.freeze,
159
+ 'Index Tags',
160
+ 'Index Tag Search',
159
161
  QueryIndexTags,
160
162
  ListIndexTags,
161
163
  :index_tags,
@@ -183,24 +185,24 @@ class Client
183
185
 
184
186
  # not supported path
185
187
  else
186
- env['icfs.page'] = 'Invalid'.freeze
187
- raise(Error::NotFound, 'Invalid request'.freeze)
188
+ env['icfs.page'] = 'Invalid'
189
+ raise(Error::NotFound, 'Invalid request')
188
190
  end
189
191
 
190
192
  rescue Error::NotFound => e
191
- return _resp_notfound( env, 'Not found: %s'.freeze %
193
+ return _resp_notfound( env, 'Not found: %s' %
192
194
  Rack::Utils.escape_html(e.message) )
193
195
 
194
196
  rescue Error::Perms => e
195
- return _resp_forbidden( env, 'Forbidden: %s'.freeze %
197
+ return _resp_forbidden( env, 'Forbidden: %s' %
196
198
  Rack::Utils.escape_html(e.message) )
197
199
 
198
200
  rescue Error::Conflict => e
199
- return _resp_conflict( env, 'Conflict: %s'.freeze %
201
+ return _resp_conflict( env, 'Conflict: %s' %
200
202
  Rack::Utils.escape_html(e.message) )
201
203
 
202
204
  rescue Error::Value => e
203
- return _resp_badreq( env, 'Invalid values: %s'.freeze %
205
+ return _resp_badreq( env, 'Invalid values: %s' %
204
206
  Rack::Utils.escape_html(e.message) )
205
207
 
206
208
  rescue Error::Interface => e
@@ -218,14 +220,14 @@ class Client
218
220
  ###############################################
219
221
  # Info page
220
222
  def _call_info(env)
221
- env['icfs.page'] = 'Info'.freeze
223
+ env['icfs.page'] = 'Info'
222
224
  api = env['icfs']
223
225
  _verb_get(env)
224
226
  body = [
225
227
  _div_nav(env),
226
- _div_desc('Info'.freeze, ''.freeze),
228
+ _div_desc('Info', ''),
227
229
  _div_info(env)
228
- ].join(''.freeze)
230
+ ].join('')
229
231
  return _resp_success(env, body)
230
232
  end # def _call_info()
231
233
 
@@ -238,13 +240,13 @@ class Client
238
240
  env['icfs.page'] = page
239
241
  api = env['icfs']
240
242
  _verb_get(env)
241
- act = '%s/%s'.freeze % [env['SCRIPT_NAME'], env['icfs.cmps'][0]]
243
+ act = '%s/%s' % [env['SCRIPT_NAME'], env['icfs.cmps'][0]]
242
244
 
243
245
  # form
244
246
  if env['QUERY_STRING'].empty?
245
247
  body = [
246
248
  _div_nav(env),
247
- _div_desc(type, ''.freeze),
249
+ _div_desc(type, ''),
248
250
  _form_query(env, query_get, {}, act, true)
249
251
  ]
250
252
 
@@ -266,7 +268,7 @@ class Client
266
268
  end
267
269
  end
268
270
 
269
- return _resp_success(env, body.join(''.freeze))
271
+ return _resp_success(env, body.join(''))
270
272
  end # def _call_search()
271
273
 
272
274
 
@@ -274,15 +276,15 @@ class Client
274
276
 
275
277
  # Case query options
276
278
  QueryCase = [
277
- ['title'.freeze, :title, :string].freeze,
278
- ['tags'.freeze, :tags, :string].freeze,
279
- ['status'.freeze, :status, :boolean].freeze,
280
- ['template'.freeze, :template, :boolean].freeze,
281
- ['grantee'.freeze, :grantee, :string].freeze,
282
- ['perm'.freeze, :perm, :string].freeze,
283
- ['size'.freeze, :size, :integer].freeze,
284
- ['page'.freeze, :page, :integer].freeze,
285
- ['purpose'.freeze, :purpose, :string].freeze,
279
+ ['title', :title, :string].freeze,
280
+ ['tags', :tags, :string].freeze,
281
+ ['status', :status, :boolean].freeze,
282
+ ['template', :template, :boolean].freeze,
283
+ ['grantee', :grantee, :string].freeze,
284
+ ['perm', :perm, :string].freeze,
285
+ ['size', :size, :integer].freeze,
286
+ ['page', :page, :integer].freeze,
287
+ ['purpose', :purpose, :string].freeze,
286
288
  ].freeze
287
289
 
288
290
 
@@ -297,19 +299,19 @@ class Client
297
299
 
298
300
  # Entry query options
299
301
  QueryEntry = [
300
- ['title'.freeze, :title, :string].freeze,
301
- ['content'.freeze, :content, :string].freeze,
302
- ['tags'.freeze, :tags, :string].freeze,
303
- ['caseid'.freeze, :caseid, :string].freeze,
304
- ['action'.freeze, :action, :integer].freeze,
305
- ['after'.freeze, :after, :time].freeze,
306
- ['before'.freeze, :before, :time].freeze,
307
- ['stat'.freeze, :stat, :string].freeze,
308
- ['credit'.freeze, :credit, :string].freeze,
309
- ['size'.freeze, :size, :integer].freeze,
310
- ['page'.freeze, :page, :integer].freeze,
311
- ['sort'.freeze, :sort, :string].freeze,
312
- ['purpose'.freeze, :purpose, :string].freeze,
302
+ ['title', :title, :string].freeze,
303
+ ['content', :content, :string].freeze,
304
+ ['tags', :tags, :string].freeze,
305
+ ['caseid', :caseid, :string].freeze,
306
+ ['action', :action, :integer].freeze,
307
+ ['after', :after, :time].freeze,
308
+ ['before', :before, :time].freeze,
309
+ ['stat', :stat, :string].freeze,
310
+ ['credit', :credit, :string].freeze,
311
+ ['size', :size, :integer].freeze,
312
+ ['page', :page, :integer].freeze,
313
+ ['sort', :sort, :string].freeze,
314
+ ['purpose', :purpose, :string].freeze,
313
315
  ].freeze
314
316
 
315
317
 
@@ -330,17 +332,17 @@ class Client
330
332
 
331
333
  # Log query options
332
334
  QueryLog = [
333
- ['caseid'.freeze, :caseid, :string].freeze,
334
- ['after'.freeze, :after, :time].freeze,
335
- ['before'.freeze, :before, :time].freeze,
336
- ['user'.freeze, :user, :string].freeze,
337
- ['entry'.freeze, :entry, :integer].freeze,
338
- ['index'.freeze, :index, :integer].freeze,
339
- ['action'.freeze, :action, :integer].freeze,
340
- ['size'.freeze, :size, :integer].freeze,
341
- ['page'.freeze, :page, :integer].freeze,
342
- ['sort'.freeze, :sort, :string].freeze,
343
- ['purpose'.freeze, :purpose, :string].freeze,
335
+ ['caseid', :caseid, :string].freeze,
336
+ ['after', :after, :time].freeze,
337
+ ['before', :before, :time].freeze,
338
+ ['user', :user, :string].freeze,
339
+ ['entry', :entry, :integer].freeze,
340
+ ['index', :index, :integer].freeze,
341
+ ['action', :action, :integer].freeze,
342
+ ['size', :size, :integer].freeze,
343
+ ['page', :page, :integer].freeze,
344
+ ['sort', :sort, :string].freeze,
345
+ ['purpose', :purpose, :string].freeze,
344
346
  ].freeze
345
347
 
346
348
 
@@ -358,18 +360,18 @@ class Client
358
360
 
359
361
  # Task query options
360
362
  QueryAction = [
361
- ['assigned'.freeze, :assigned, :string].freeze,
362
- ['caseid'.freeze, :caseid, :string].freeze,
363
- ['title'.freeze, :title, :string].freeze,
364
- ['status'.freeze, :status, :boolean].freeze,
365
- ['flag'.freeze, :flag, :boolean].freeze,
366
- ['before'.freeze, :before, :time].freeze,
367
- ['after'.freeze, :after, :time].freeze,
368
- ['tags'.freeze, :tags, :string].freeze,
369
- ['purpose'.freeze, :purpose, :string].freeze,
370
- ['size'.freeze, :size, :integer].freeze,
371
- ['page'.freeze, :page, :integer].freeze,
372
- ['sort'.freeze, :sort, :string].freeze,
363
+ ['assigned', :assigned, :string].freeze,
364
+ ['caseid', :caseid, :string].freeze,
365
+ ['title', :title, :string].freeze,
366
+ ['status', :status, :boolean].freeze,
367
+ ['flag', :flag, :boolean].freeze,
368
+ ['before', :before, :time].freeze,
369
+ ['after', :after, :time].freeze,
370
+ ['tags', :tags, :string].freeze,
371
+ ['purpose', :purpose, :string].freeze,
372
+ ['size', :size, :integer].freeze,
373
+ ['page', :page, :integer].freeze,
374
+ ['sort', :sort, :string].freeze,
373
375
  ].freeze
374
376
 
375
377
 
@@ -388,13 +390,13 @@ class Client
388
390
  # Do an index lookup
389
391
  #
390
392
  def _call_index_lookup(env)
391
- env['icfs.page'] = 'Index Lookup'.freeze
393
+ env['icfs.page'] = 'Index Lookup'
392
394
  api = env['icfs']
393
395
  _verb_get(env)
394
396
 
395
397
  # query required
396
398
  if env['QUERY_STRING'].empty?
397
- raise(Error::Interface, 'Query string required'.freeze)
399
+ raise(Error::Interface, 'Query string required')
398
400
  end
399
401
 
400
402
  # do the query
@@ -415,7 +417,7 @@ class Client
415
417
  end
416
418
  body = JSON.generate(body)
417
419
  head = {
418
- 'Content-Type' => 'application/json'.freeze,
420
+ 'Content-Type' => 'application/json',
419
421
  'Content-Length' => body.bytesize.to_s
420
422
  }
421
423
  return [200, head, [body]]
@@ -424,15 +426,15 @@ class Client
424
426
 
425
427
  # Index query options
426
428
  QueryIndex = [
427
- ['caseid'.freeze, :caseid, :string].freeze,
428
- ['title'.freeze, :title, :string].freeze,
429
- ['prefix'.freeze, :prefix, :string].freeze,
430
- ['content'.freeze, :content, :string].freeze,
431
- ['tags'.freeze, :tags, :string].freeze,
432
- ['purpose'.freeze, :purpose, :string].freeze,
433
- ['size'.freeze, :size, :integer].freeze,
434
- ['page'.freeze, :page, :integer].freeze,
435
- ['sort'.freeze, :sort, :string].freeze,
429
+ ['caseid', :caseid, :string].freeze,
430
+ ['title', :title, :string].freeze,
431
+ ['prefix', :prefix, :string].freeze,
432
+ ['content', :content, :string].freeze,
433
+ ['tags', :tags, :string].freeze,
434
+ ['purpose', :purpose, :string].freeze,
435
+ ['size', :size, :integer].freeze,
436
+ ['page', :page, :integer].freeze,
437
+ ['sort', :sort, :string].freeze,
436
438
  ].freeze
437
439
 
438
440
 
@@ -447,11 +449,11 @@ class Client
447
449
 
448
450
  # Stats query options
449
451
  QueryStats = [
450
- ['credit'.freeze, :credit, :string].freeze,
451
- ['caseid'.freeze, :caseid, :string].freeze,
452
- ['before'.freeze, :before, :time].freeze,
453
- ['after'.freeze, :after, :time].freeze,
454
- ['purpose'.freeze, :purpose, :string].freeze,
452
+ ['credit', :credit, :string].freeze,
453
+ ['caseid', :caseid, :string].freeze,
454
+ ['before', :before, :time].freeze,
455
+ ['after', :after, :time].freeze,
456
+ ['purpose', :purpose, :string].freeze,
455
457
  ].freeze
456
458
 
457
459
  # Stats list options
@@ -464,10 +466,10 @@ class Client
464
466
 
465
467
  # Query for case tags
466
468
  QueryCaseTags = [
467
- ['status'.freeze, :status, :boolean].freeze,
468
- ['template'.freeze, :template, :boolean].freeze,
469
- ['grantee'.freeze, :grantee, :string].freeze,
470
- ['purpose'.freeze, :purpose, :string].freeze,
469
+ ['status', :status, :boolean].freeze,
470
+ ['template', :template, :boolean].freeze,
471
+ ['grantee', :grantee, :string].freeze,
472
+ ['purpose', :purpose, :string].freeze,
471
473
  ].freeze
472
474
 
473
475
 
@@ -480,8 +482,8 @@ class Client
480
482
 
481
483
  # Entry tags query options
482
484
  QueryEntryTags = [
483
- ['caseid'.freeze, :caseid, :string].freeze,
484
- ['purpose'.freeze, :purpose, :string].freeze,
485
+ ['caseid', :caseid, :string].freeze,
486
+ ['purpose', :purpose, :string].freeze,
485
487
  ].freeze
486
488
 
487
489
 
@@ -494,13 +496,13 @@ class Client
494
496
 
495
497
  # Action Tag query
496
498
  QueryActionTags = [
497
- ['caseid'.freeze, :caseid, :string].freeze,
498
- ['assigned'.freeze, :assigned, :string].freeze,
499
- ['status'.freeze, :status, :boolean].freeze,
500
- ['flag'.freeze, :flag, :boolean].freeze,
501
- ['before'.freeze, :before, :time].freeze,
502
- ['after'.freeze, :after, :time].freeze,
503
- ['purpose'.freeze, :purpose, :string].freeze,
499
+ ['caseid', :caseid, :string].freeze,
500
+ ['assigned', :assigned, :string].freeze,
501
+ ['status', :status, :boolean].freeze,
502
+ ['flag', :flag, :boolean].freeze,
503
+ ['before', :before, :time].freeze,
504
+ ['after', :after, :time].freeze,
505
+ ['purpose', :purpose, :string].freeze,
504
506
  ].freeze
505
507
 
506
508
 
@@ -513,8 +515,8 @@ class Client
513
515
 
514
516
  # Index tags query
515
517
  QueryIndexTags = [
516
- ['caseid'.freeze, :caseid, :string].freeze,
517
- ['purpose'.freeze, :purpose, :string].freeze,
518
+ ['caseid', :caseid, :string].freeze,
519
+ ['purpose', :purpose, :string].freeze,
518
520
  ].freeze
519
521
 
520
522
 
@@ -529,15 +531,15 @@ class Client
529
531
  # Create a new case
530
532
  #
531
533
  def _call_case_create(env)
532
- env['icfs.page'] = 'Case Create'.freeze
534
+ env['icfs.page'] = 'Case Create'
533
535
  api = env['icfs']
534
536
  tid = _util_case(env)
535
537
  _verb_getpost(env)
536
538
 
537
539
  # get the form
538
- if env['REQUEST_METHOD'] == 'GET'.freeze
540
+ if env['REQUEST_METHOD'] == 'GET'
539
541
  tpl = api.case_read(tid)
540
- tpl['title'] = ''.freeze
542
+ tpl['title'] = ''
541
543
  parts = [
542
544
  _form_entry(env, tid, nil),
543
545
  _form_create(env),
@@ -546,25 +548,25 @@ class Client
546
548
  body = [
547
549
  _div_nav(env),
548
550
  _div_desc(
549
- 'Create New Case'.freeze,
550
- '<i>template:</i> %s'.freeze % Rack::Utils.escape_html(tid),
551
+ 'Create New Case',
552
+ '<i>template:</i> %s' % Rack::Utils.escape_html(tid),
551
553
  ),
552
- _div_form(env, '/case_create/'.freeze, tid, parts, 'Create Case'.freeze)
553
- ].join(''.freeze)
554
+ _div_form(env, '/case_create/', tid, parts, 'Create Case')
555
+ ].join('')
554
556
  return _resp_success(env, body)
555
557
 
556
558
  # post the form
557
- elsif env['REQUEST_METHOD'] == 'POST'.freeze
559
+ elsif env['REQUEST_METHOD'] == 'POST'
558
560
  para = _util_post(env)
559
561
 
560
562
  # process
561
563
  cse = _post_case(env, para)
562
564
  cid = para['create_cid']
563
- cse['template'] = (para['create_tmpl'] == 'true'.freeze) ? true : false
565
+ cse['template'] = (para['create_tmpl'] == 'true') ? true : false
564
566
 
565
567
  # process entry
566
568
  ent = _post_entry(env, para)
567
- Items.validate(tid, 'Template ID'.freeze, Items::FieldCaseid)
569
+ Items.validate(tid, 'Template ID', Items::FieldCaseid)
568
570
  ent['caseid'] = cid
569
571
 
570
572
  # create
@@ -582,13 +584,13 @@ class Client
582
584
  # Edit a case
583
585
  #
584
586
  def _call_case_edit(env)
585
- env['icfs.page'] = 'Case Edit'.freeze
587
+ env['icfs.page'] = 'Case Edit'
586
588
  cid = _util_case(env)
587
589
  api = env['icfs']
588
590
  _verb_getpost(env)
589
591
 
590
592
  # get the form
591
- if env['REQUEST_METHOD'] == 'GET'.freeze
593
+ if env['REQUEST_METHOD'] == 'GET'
592
594
  cse = api.case_read(cid)
593
595
  parts = [
594
596
  _form_entry(env, cid, nil),
@@ -596,13 +598,13 @@ class Client
596
598
  ]
597
599
  body = [
598
600
  _div_nav(env),
599
- _div_desc('Edit Case'.freeze, ''.freeze),
600
- _div_form(env, '/case_edit/'.freeze, cid, parts, 'Record Case'.freeze),
601
- ].join(''.freeze)
601
+ _div_desc('Edit Case', ''),
602
+ _div_form(env, '/case_edit/', cid, parts, 'Record Case'),
603
+ ].join('')
602
604
  return _resp_success(env, body)
603
605
 
604
606
  # post the form
605
- elsif env['REQUEST_METHOD'] == 'POST'.freeze
607
+ elsif env['REQUEST_METHOD'] == 'POST'
606
608
  para = _util_post(env)
607
609
 
608
610
  # process
@@ -629,32 +631,32 @@ class Client
629
631
  # Edit an entry
630
632
  #
631
633
  def _call_entry_edit(env)
632
- env['icfs.page'] = 'Entry Edit'.freeze
634
+ env['icfs.page'] = 'Entry Edit'
633
635
  api = env['icfs']
634
636
  _verb_getpost(env)
635
637
 
636
638
  cid = _util_case(env)
637
639
 
638
640
  # get the form
639
- if env['REQUEST_METHOD'] == 'GET'.freeze
641
+ if env['REQUEST_METHOD'] == 'GET'
640
642
  enum = _util_num(env, 2)
641
643
  anum = _util_num(env, 3)
642
644
 
643
645
  # entry or action specified
644
646
  if enum != 0
645
- desc = 'Edit Entry'.freeze
647
+ desc = 'Edit Entry'
646
648
  ent = api.entry_read(cid, enum)
647
649
  elsif anum != 0
648
- desc = 'New Entry in Action'.freeze
650
+ desc = 'New Entry in Action'
649
651
  act = api.action_read(cid, anum)
650
652
  else
651
- desc = 'New Entry'.freeze
653
+ desc = 'New Entry'
652
654
  end
653
655
 
654
656
  # see if editing is possible
655
657
  unless( api.access_list(cid).include?(ICFS::PermWrite) || (
656
658
  (anum != 0) && api.tasked?(cid, anum)))
657
- raise(Error::Perms, 'Not able to edit this entry.'.freeze)
659
+ raise(Error::Perms, 'Not able to edit this entry.')
658
660
  end
659
661
 
660
662
  # build form
@@ -665,14 +667,14 @@ class Client
665
667
  end
666
668
  body = [
667
669
  _div_nav(env),
668
- _div_desc(desc, ''.freeze),
669
- _div_form(env, '/entry_edit/'.freeze, cid, parts,
670
- 'Record Entry'.freeze),
671
- ].join(''.freeze)
670
+ _div_desc(desc, ''),
671
+ _div_form(env, '/entry_edit/', cid, parts,
672
+ 'Record Entry'),
673
+ ].join('')
672
674
  return _resp_success(env, body)
673
675
 
674
676
  # post the form
675
- elsif env['REQUEST_METHOD'] == 'POST'.freeze
677
+ elsif env['REQUEST_METHOD'] == 'POST'
676
678
  para = _util_post(env)
677
679
 
678
680
  # process
@@ -691,7 +693,7 @@ class Client
691
693
  _div_entry(env, ent)
692
694
  ]
693
695
  body << _div_action(env, act) if act
694
- return _resp_success(env, body.join(''.freeze))
696
+ return _resp_success(env, body.join(''))
695
697
  end
696
698
  end # def _call_entry_edit()
697
699
 
@@ -700,18 +702,18 @@ class Client
700
702
  # Edit an Index
701
703
  #
702
704
  def _call_index_edit(env)
703
- env['icfs.page'] = 'Index Edit'.freeze
705
+ env['icfs.page'] = 'Index Edit'
704
706
  api = env['icfs']
705
707
  _verb_getpost(env)
706
708
 
707
709
  cid = _util_case(env)
708
710
 
709
711
  # get the form
710
- if env['REQUEST_METHOD'] == 'GET'.freeze
712
+ if env['REQUEST_METHOD'] == 'GET'
711
713
 
712
714
  # see if editing is possible
713
715
  unless api.access_list(cid).include?(ICFS::PermWrite)
714
- raise(Error::Perms, 'Not able to edit this index.'.freeze)
716
+ raise(Error::Perms, 'Not able to edit this index.')
715
717
  end
716
718
 
717
719
  xnum = _util_num(env, 2)
@@ -720,17 +722,17 @@ class Client
720
722
  _form_entry(env, cid, nil),
721
723
  _form_index(env, cid, idx),
722
724
  ]
723
- desc = idx ? 'Edit Index'.freeze : 'New Index'.freeze
725
+ desc = idx ? 'Edit Index' : 'New Index'
724
726
  body = [
725
727
  _div_nav(env),
726
- _div_desc(desc, ''.freeze),
727
- _div_form(env, '/index_edit/'.freeze, cid, parts,
728
- 'Record Index'.freeze),
729
- ].join(''.freeze)
728
+ _div_desc(desc, ''),
729
+ _div_form(env, '/index_edit/', cid, parts,
730
+ 'Record Index'),
731
+ ].join('')
730
732
  return _resp_success(env, body)
731
733
 
732
734
  # post the form
733
- elsif env['REQUEST_METHOD'] == 'POST'.freeze
735
+ elsif env['REQUEST_METHOD'] == 'POST'
734
736
  para = _util_post(env)
735
737
 
736
738
  # process
@@ -749,7 +751,7 @@ class Client
749
751
  _div_nav(env),
750
752
  _div_entry(env, ent),
751
753
  _div_index(env, idx)
752
- ].join(''.freeze)
754
+ ].join('')
753
755
  return _resp_success(env, body)
754
756
  end
755
757
  end # def _call_index_edit()
@@ -759,24 +761,24 @@ class Client
759
761
  # Edit configuration
760
762
  #
761
763
  def _call_config_edit(env)
762
- env['icfs.page'] = 'Config Edit'.freeze
764
+ env['icfs.page'] = 'Config Edit'
763
765
  api = env['icfs']
764
- cfg = env['icfs.config']
766
+ cfg = api.config
765
767
  _verb_getpost(env)
766
768
 
767
769
  # get the form
768
- if env['REQUEST_METHOD'] == 'GET'.freeze
770
+ if env['REQUEST_METHOD'] == 'GET'
769
771
  parts = [ _form_config(env) ]
770
772
  body = [
771
773
  _div_nav(env),
772
- _div_desc('Edit Configuration'.freeze, ''.freeze),
773
- _div_form(env, '/config_edit/'.freeze, nil, parts,
774
- 'Save Config'.freeze),
775
- ].join(''.freeze)
774
+ _div_desc('Edit Configuration', ''),
775
+ _div_form(env, '/config_edit/', nil, parts,
776
+ 'Save Config'),
777
+ ].join('')
776
778
  return _resp_success(env, body)
777
779
 
778
780
  # post the form
779
- elsif env['REQUEST_METHOD'] == 'POST'.freeze
781
+ elsif env['REQUEST_METHOD'] == 'POST'
780
782
  para = _util_post(env)
781
783
  _post_config(env, para).each{|key, val| cfg.set(key,val) }
782
784
  cfg.save
@@ -785,9 +787,9 @@ class Client
785
787
  # display the index
786
788
  body = [
787
789
  _div_nav(env),
788
- _div_desc('Edit Configuration'.freeze, 'Settings saved'.freeze),
790
+ _div_desc('Edit Configuration', 'Settings saved'),
789
791
  _div_info(env),
790
- ].join(''.freeze)
792
+ ].join('')
791
793
  return _resp_success(env, body)
792
794
  end
793
795
  end # def _call_config_edit()
@@ -796,13 +798,13 @@ class Client
796
798
  ###############################################
797
799
  # User Home page
798
800
  def _call_home(env)
799
- env['icfs.page'] = 'Home'.freeze
801
+ env['icfs.page'] = 'Home'
800
802
  _verb_get(env)
801
803
  body = [
802
804
  _div_nav(env),
803
- _div_desc('User Home'.freeze, ''.freeze),
805
+ _div_desc('User Home', ''),
804
806
  _div_home(env),
805
- ].join(''.freeze)
807
+ ].join('')
806
808
  return _resp_success(env, body)
807
809
  end # def _call_home()
808
810
 
@@ -811,22 +813,22 @@ class Client
811
813
  # Display a Case
812
814
  #
813
815
  def _call_case(env)
814
- env['icfs.page'] = 'Case View'.freeze
816
+ env['icfs.page'] = 'Case View'
815
817
  api = env['icfs']
816
818
  _verb_get(env)
817
819
  cid = _util_case(env)
818
820
  lnum = _util_num(env, 2)
819
821
  cse = api.case_read(cid, lnum)
820
822
  if lnum != 0
821
- msg = 'This is a historical version of this Case'.freeze
823
+ msg = 'This is a historical version of this Case'
822
824
  else
823
- msg = ''.freeze
825
+ msg = ''
824
826
  end
825
827
  body = [
826
828
  _div_nav(env),
827
- _div_desc('Case Information'.freeze, msg),
829
+ _div_desc('Case Information', msg),
828
830
  _div_case(env, cse),
829
- ].join(''.freeze)
831
+ ].join('')
830
832
  return _resp_success(env, body)
831
833
  end # def _call_case()
832
834
 
@@ -835,24 +837,24 @@ class Client
835
837
  # Display an Entry
836
838
  #
837
839
  def _call_entry(env)
838
- env['icfs.page'] = 'Entry View'.freeze
840
+ env['icfs.page'] = 'Entry View'
839
841
  api = env['icfs']
840
842
  _verb_get(env)
841
843
  cid = _util_case(env)
842
844
  enum = _util_num(env, 2)
843
845
  lnum = _util_num(env, 3)
844
- raise(Error::Interface, 'No Entry requested'.freeze) if enum == 0
846
+ raise(Error::Interface, 'No Entry requested') if enum == 0
845
847
  ent = api.entry_read(cid, enum, lnum)
846
848
  if lnum != 0
847
- msg = 'This is a historical version of this Entry'.freeze
849
+ msg = 'This is a historical version of this Entry'
848
850
  else
849
- msg = ''.freeze
851
+ msg = ''
850
852
  end
851
853
  body = [
852
854
  _div_nav(env),
853
- _div_desc('View Entry'.freeze, msg),
855
+ _div_desc('View Entry', msg),
854
856
  _div_entry(env, ent),
855
- ].join(''.freeze)
857
+ ].join('')
856
858
  return _resp_success(env, body)
857
859
  end # def _call_entry()
858
860
 
@@ -861,18 +863,18 @@ class Client
861
863
  # Display a Log
862
864
  #
863
865
  def _call_log(env)
864
- env['icfs.page'] = 'Log View'.freeze
866
+ env['icfs.page'] = 'Log View'
865
867
  api = env['icfs']
866
868
  _verb_get(env)
867
869
  cid = _util_case(env)
868
870
  lnum = _util_num(env, 2)
869
- raise(Error::Interface, 'No log requested'.freeze) if lnum == 0
871
+ raise(Error::Interface, 'No log requested') if lnum == 0
870
872
  log = api.log_read(cid, lnum)
871
873
  body = [
872
874
  _div_nav(env),
873
- _div_desc('View Log'.freeze, ''.freeze),
875
+ _div_desc('View Log', ''),
874
876
  _div_log(env, log)
875
- ].join(''.freeze)
877
+ ].join('')
876
878
  return _resp_success(env, body)
877
879
  end # def _call_log()
878
880
 
@@ -881,38 +883,38 @@ class Client
881
883
  # Display an Action
882
884
  #
883
885
  def _call_action(env)
884
- env['icfs.page'] = 'Action View'.freeze
886
+ env['icfs.page'] = 'Action View'
885
887
  api = env['icfs']
886
888
  _verb_get(env)
887
889
  cid = _util_case(env)
888
890
  anum = _util_num(env, 2)
889
891
  lnum = _util_num(env, 3)
890
- raise(Error::Interface, 'No Action requested'.freeze) if anum == 0
892
+ raise(Error::Interface, 'No Action requested') if anum == 0
891
893
 
892
894
  # get the action
893
895
  act = api.action_read(cid, anum, lnum)
894
896
  if lnum != 0
895
- msg = 'This is a historical version of this Action'.freeze
897
+ msg = 'This is a historical version of this Action'
896
898
  else
897
- msg = ''.freeze
899
+ msg = ''
898
900
  end
899
901
 
900
902
  # get the entries
901
903
  query = {
902
904
  caseid: cid,
903
905
  action: anum,
904
- purpose: 'Action Entries'.freeze,
906
+ purpose: 'Action Entries',
905
907
  }
906
908
  resp = api.entry_search(query)
907
909
 
908
910
  # display
909
911
  body = [
910
912
  _div_nav(env),
911
- _div_desc('View Action'.freeze, msg),
913
+ _div_desc('View Action', msg),
912
914
  _div_action(env, act),
913
915
  _div_list(env, resp, ListEntry),
914
916
  _div_page(resp){|qu, txt| _a_entry_search(env, qu, txt)},
915
- ].join(''.freeze)
917
+ ].join('')
916
918
  return _resp_success(env, body)
917
919
  end # def _call_action()
918
920
 
@@ -921,20 +923,20 @@ class Client
921
923
  # Display an Index
922
924
  #
923
925
  def _call_index(env)
924
- env['icfs.page'] = 'Index View'.freeze
926
+ env['icfs.page'] = 'Index View'
925
927
  api = env['icfs']
926
928
  _verb_get(env)
927
929
  cid = _util_case(env)
928
930
  xnum = _util_num(env, 2)
929
931
  lnum = _util_num(env, 3)
930
- raise(Error::Interface, 'No Index requested'.freeze) if xnum == 0
932
+ raise(Error::Interface, 'No Index requested') if xnum == 0
931
933
 
932
934
  # get the index
933
935
  idx = api.index_read(cid, xnum, lnum)
934
936
  if lnum != 0
935
- msg = 'This is a historical version of this Index'.freeze
937
+ msg = 'This is a historical version of this Index'
936
938
  else
937
- msg = ''.freeze
939
+ msg = ''
938
940
  end
939
941
 
940
942
  # get the entries
@@ -947,11 +949,11 @@ class Client
947
949
  # display
948
950
  body = [
949
951
  _div_nav(env) +
950
- _div_desc('View Index'.freeze, msg),
952
+ _div_desc('View Index', msg),
951
953
  _div_index(env, idx),
952
954
  _div_list(env, resp, ListEntry),
953
955
  _div_page(resp){|qu, txt| _a_entry_search(env, qu, txt)},
954
- ].join(''.freeze)
956
+ ].join('')
955
957
  return _resp_success(env, body)
956
958
  end # def _call_index()
957
959
 
@@ -959,7 +961,7 @@ class Client
959
961
  ###############################################
960
962
  # Get a file
961
963
  def _call_file(env)
962
- env['icfs.page'] = 'File Download'.freeze
964
+ env['icfs.page'] = 'File Download'
963
965
  api = env['icfs']
964
966
  _verb_get(env)
965
967
  cid = _util_case(env)
@@ -967,21 +969,21 @@ class Client
967
969
  # get filename
968
970
  cmps = env['icfs.cmps']
969
971
  if cmps.size < 3 || cmps[2].empty?
970
- raise(Error::Interface, 'No file specified in the URL'.freeze)
972
+ raise(Error::Interface, 'No file specified in the URL')
971
973
  end
972
974
  fnam = Rack::Utils.unescape(cmps[2])
973
975
  ma = /^(\d+)-(\d+)-(\d+)-(.+)$/.match fnam
974
976
  if !ma
975
- raise(Error::Interface, 'File not properly specified in URL'.freeze)
977
+ raise(Error::Interface, 'File not properly specified in URL')
976
978
  end
977
979
  enum = ma[1].to_i
978
980
  lnum = ma[2].to_i
979
981
  fnum = ma[3].to_i
980
- ext = ma[4].rpartition('.'.freeze)[2]
982
+ ext = ma[4].rpartition('.')[2]
981
983
 
982
984
  # get MIME-type by extension
983
985
  if ext.empty?
984
- mime = 'application/octet-stream'.freeze
986
+ mime = 'application/octet-stream'
985
987
  else
986
988
  mime = Rack::Mime.mime_type('.' + ext)
987
989
  end
@@ -992,7 +994,7 @@ class Client
992
994
  headers = {
993
995
  'Content-Length' => file.size.to_s,
994
996
  'Content-Type' => mime,
995
- 'Content-Disposition' => 'attachment'.freeze,
997
+ 'Content-Disposition' => 'attachment',
996
998
  }
997
999
  return [200, headers, fr]
998
1000
 
@@ -1017,59 +1019,59 @@ class Client
1017
1019
  tabs = [
1018
1020
  _a_entry_search(env, {
1019
1021
  caseid: cid,
1020
- purpose: 'Case Entries'.freeze,
1021
- }, 'Entries'.freeze),
1022
+ purpose: 'Case Entries',
1023
+ }, 'Entries'),
1022
1024
  _a_index_search(env, {
1023
1025
  caseid: cid,
1024
- purpose: 'Case Indexes'.freeze,
1025
- }, 'Indexes'.freeze),
1026
+ purpose: 'Case Indexes',
1027
+ }, 'Indexes'),
1026
1028
  _a_stats(env, {
1027
1029
  caseid: cid,
1028
- purpose: 'Case Stats'.freeze,
1029
- }, 'Stats'.freeze),
1030
+ purpose: 'Case Stats',
1031
+ }, 'Stats'),
1030
1032
  _a_entry_tags(env, {
1031
1033
  caseid: cid,
1032
- purpose: 'Entry Tags'.freeze,
1033
- }, 'Entry Tags'.freeze),
1034
+ purpose: 'Entry Tags',
1035
+ }, 'Entry Tags'),
1034
1036
  _a_index_tags(env, {
1035
1037
  caseid: cid,
1036
- purpose: 'Index Tags'.freeze,
1037
- }, 'Index Tags'.freeze),
1038
- _a_entry_edit(env, cid, 0, 0, 'New Entry'.freeze),
1039
- _a_index_edit(env, cid, 0, 'New Index'.freeze),
1038
+ purpose: 'Index Tags',
1039
+ }, 'Index Tags'),
1040
+ _a_entry_edit(env, cid, 0, 0, 'New Entry'),
1041
+ _a_index_edit(env, cid, 0, 'New Index'),
1040
1042
  ]
1041
1043
 
1042
1044
  # no case
1043
1045
  else
1044
- tc = ''.freeze
1046
+ tc = ''
1045
1047
  tabs = [
1046
1048
  _a_action_search(env, {
1047
1049
  assigned: unam,
1048
1050
  status: true,
1049
1051
  flag: true,
1050
- purpose: 'Flagged Actions'.freeze,
1051
- }, 'Actions'.freeze),
1052
+ purpose: 'Flagged Actions',
1053
+ }, 'Actions'),
1052
1054
  _a_case_search(env, {
1053
1055
  grantee: unam,
1054
1056
  status: true,
1055
1057
  template: false,
1056
- purpose: 'Open Cases'.freeze,
1057
- }, 'Cases'.freeze),
1058
+ purpose: 'Open Cases',
1059
+ }, 'Cases'),
1058
1060
  _a_stats(env, {
1059
1061
  credit: unam,
1060
1062
  after: Time.now.to_i - 60*60*24*30,
1061
- purpose: 'User Stats - Last 30 days'.freeze,
1062
- }, 'Stats'.freeze),
1063
+ purpose: 'User Stats - Last 30 days',
1064
+ }, 'Stats'),
1063
1065
  _a_config_edit(env, 'Config'),
1064
- _a_info(env, 'Info'.freeze),
1066
+ _a_info(env, 'Info'),
1065
1067
  ]
1066
1068
  end
1067
1069
 
1068
1070
  # tab divs
1069
- tabs = tabs.map{|aa| DivNavTab % aa}.join(''.freeze)
1071
+ tabs = tabs.map{|aa| DivNavTab % aa}.join('')
1070
1072
 
1071
1073
  return DivNav % [
1072
- _a_home(env, 'ICFS'.freeze),
1074
+ _a_home(env, 'ICFS'),
1073
1075
  tc,
1074
1076
  tabs
1075
1077
  ]
@@ -1081,12 +1083,12 @@ class Client
1081
1083
  <div class="nav">
1082
1084
  <div class="nav-icfs">%s</div>
1083
1085
  <div class="nav-case">%s</div>%s
1084
- </div>'.freeze
1086
+ </div>'
1085
1087
 
1086
1088
 
1087
1089
  # navbar tab
1088
1090
  DivNavTab = '
1089
- <div class="nav-tab">%s</div>'.freeze
1091
+ <div class="nav-tab">%s</div>'
1090
1092
 
1091
1093
 
1092
1094
  ###############################################
@@ -1100,7 +1102,7 @@ class Client
1100
1102
  # message div
1101
1103
  DivMsg = '
1102
1104
  <div class="message">%s
1103
- </div>'.freeze
1105
+ </div>'
1104
1106
 
1105
1107
 
1106
1108
  ###############################################
@@ -1108,7 +1110,7 @@ class Client
1108
1110
  #
1109
1111
  def _div_info(env)
1110
1112
  api = env['icfs']
1111
- tz = env['icfs.config'].get('tz')
1113
+ tz = api.config.get('tz')
1112
1114
 
1113
1115
  # roles/groups/perms
1114
1116
  roles = api.roles.map{|rol| DivInfoList % Rack::Utils.escape_html(rol)}
@@ -1121,10 +1123,10 @@ class Client
1121
1123
  return DivInfo % [
1122
1124
  Rack::Utils.escape_html(tz),
1123
1125
  Rack::Utils.escape_html(api.user),
1124
- roles.join(''.freeze),
1125
- grps.join(''.freeze),
1126
- perms.join(''.freeze),
1127
- gstats.join(''.freeze),
1126
+ roles.join(''),
1127
+ grps.join(''),
1128
+ perms.join(''),
1129
+ gstats.join(''),
1128
1130
  ]
1129
1131
  end # def _div_info()
1130
1132
 
@@ -1162,31 +1164,31 @@ class Client
1162
1164
  </div>
1163
1165
  </div>
1164
1166
  </div>
1165
- </div>'.freeze
1167
+ </div>'
1166
1168
 
1167
1169
 
1168
1170
  # List items in the info div
1169
1171
  DivInfoList = '
1170
- <div>%s</div>'.freeze
1172
+ <div>%s</div>'
1171
1173
 
1172
1174
 
1173
1175
  # Column classes by symbol
1174
1176
  ListColClass = {
1175
- entry: 'list-int'.freeze,
1176
- action: 'list-int'.freeze,
1177
- index: 'list-int'.freeze,
1178
- log: 'list-int'.freeze,
1179
- tags: 'list-int'.freeze,
1180
- tag: 'list-tag'.freeze,
1181
- stats: 'list-int'.freeze,
1182
- time: 'list-time'.freeze,
1183
- title: 'list-title'.freeze,
1184
- caseid: 'list-caseid'.freeze,
1185
- stat: 'list-stat'.freeze,
1186
- sum: 'list-float'.freeze,
1187
- count: 'list-int'.freeze,
1188
- files: 'list-int'.freeze,
1189
- user: 'list-usergrp'.freeze,
1177
+ entry: 'list-int',
1178
+ action: 'list-int',
1179
+ index: 'list-int',
1180
+ log: 'list-int',
1181
+ tags: 'list-int',
1182
+ tag: 'list-tag',
1183
+ stats: 'list-int',
1184
+ time: 'list-time',
1185
+ title: 'list-title',
1186
+ caseid: 'list-caseid',
1187
+ stat: 'list-stat',
1188
+ sum: 'list-float',
1189
+ count: 'list-int',
1190
+ files: 'list-int',
1191
+ user: 'list-usergrp',
1190
1192
  }.freeze
1191
1193
 
1192
1194
 
@@ -1198,7 +1200,7 @@ class Client
1198
1200
  # @param list [Array] List of object items to display and how
1199
1201
  #
1200
1202
  def _div_list(env, resp, list)
1201
- return _div_msg(env, 'No results found'.freeze) if resp[:list].size == 0
1203
+ return _div_msg(env, 'No results found') if resp[:list].size == 0
1202
1204
 
1203
1205
  # did we query with caseid?
1204
1206
  qcid = resp[:query].key?(:caseid)
@@ -1209,12 +1211,12 @@ class Client
1209
1211
  # header row
1210
1212
  hcols = list.map do |sym, opt|
1211
1213
  if sym == :caseid && qcid
1212
- ''.freeze
1214
+ ''
1213
1215
  else
1214
1216
  DivListHeadItems[sym]
1215
1217
  end
1216
1218
  end
1217
- head = DivListHead % hcols.join(''.freeze)
1219
+ head = DivListHead % hcols.join('')
1218
1220
 
1219
1221
  # search results into rows
1220
1222
  rows = resp[:list].map do |sr|
@@ -1228,14 +1230,14 @@ class Client
1228
1230
  # snippets are special non-column, not in the object itself
1229
1231
  if sym == :snippet
1230
1232
  if sr[:snippet]
1231
- next( DivListItem % ['list-snip'.freeze, sr[:snippet]])
1233
+ next( DivListItem % ['list-snip', sr[:snippet]])
1232
1234
  else
1233
- next(''.freeze)
1235
+ next('')
1234
1236
  end
1235
1237
 
1236
1238
  # redacted result
1237
1239
  elsif it.nil?
1238
- next( DivListItem % [cc, '&mdash;'.freeze])
1240
+ next( DivListItem % [cc, '&mdash;'])
1239
1241
  end
1240
1242
 
1241
1243
  # normal result
@@ -1264,29 +1266,29 @@ class Client
1264
1266
  when :action
1265
1267
  case opt
1266
1268
  when :current
1267
- cd = (it == 0) ? ''.freeze : _a_action(env, cid, it, 0, it.to_s)
1269
+ cd = (it == 0) ? '' : _a_action(env, cid, it, 0, it.to_s)
1268
1270
  when :log
1269
1271
  if it != 0
1270
1272
  cd = _a_action(env, cid, it, obj[:log], it.to_s)
1271
1273
  else
1272
- cd = ''.freeze
1274
+ cd = ''
1273
1275
  end
1274
1276
  else
1275
- cd = it == 0 ? ''.freeze : it.to_s
1277
+ cd = it == 0 ? '' : it.to_s
1276
1278
  end
1277
1279
 
1278
1280
  # index
1279
1281
  when :index
1280
1282
  case opt
1281
1283
  when :entry
1282
- cd = (it == 0) ? ''.freeze : it.to_s
1284
+ cd = (it == 0) ? '' : it.to_s
1283
1285
  when :current
1284
1286
  cd = _a_index(env, cid, it, 0, it.to_s)
1285
1287
  when :log
1286
1288
  if it != 0
1287
1289
  cd = _a_index(env, cid, it, obj[:log], it.to_s)
1288
1290
  else
1289
- cd = ''.freeze
1291
+ cd = ''
1290
1292
  end
1291
1293
  else
1292
1294
  cd = it.to_s
@@ -1304,7 +1306,7 @@ class Client
1304
1306
  # tags
1305
1307
  when :tags
1306
1308
  if it.size == 1 && it[0] == ICFS::TagNone
1307
- cd = ''.freeze
1309
+ cd = ''
1308
1310
  else
1309
1311
  cd = it.size.to_s
1310
1312
  end
@@ -1315,16 +1317,16 @@ class Client
1315
1317
 
1316
1318
  case opt
1317
1319
  when :entry
1318
- qu[:purpose] = 'Entry Tag Search'.freeze
1320
+ qu[:purpose] = 'Entry Tag Search'
1319
1321
  cd = _a_entry_search(env, qu, it)
1320
1322
  when :index
1321
- qu[:purpose] = 'Index Tag Search'.freeze
1323
+ qu[:purpose] = 'Index Tag Search'
1322
1324
  cd = _a_index_search(env, qu, it)
1323
1325
  when :case
1324
- qu[:purpose] = 'Case Tag Search'.freeze
1326
+ qu[:purpose] = 'Case Tag Search'
1325
1327
  cd = _a_case_search(env, qu, it)
1326
1328
  when :action
1327
- qu[:purpose] = 'Action Tag Search'.freeze
1329
+ qu[:purpose] = 'Action Tag Search'
1328
1330
  cd = _a_action_search(env, qu, it)
1329
1331
  end
1330
1332
 
@@ -1370,7 +1372,7 @@ class Client
1370
1372
  # stat - only on stats aggregation
1371
1373
  when :stat
1372
1374
  qu[:stat] = it
1373
- qu[:purpose] = 'Entry Stat Search'.freeze
1375
+ qu[:purpose] = 'Entry Stat Search'
1374
1376
  cd = _a_entry_search(env, qu, it)
1375
1377
 
1376
1378
  # sum - only on stats aggregation
@@ -1383,7 +1385,7 @@ class Client
1383
1385
 
1384
1386
  # files
1385
1387
  when :files
1386
- cd = it == 0 ? ''.freeze : it.to_s
1388
+ cd = it == 0 ? '' : it.to_s
1387
1389
 
1388
1390
  # user
1389
1391
  when :user
@@ -1391,20 +1393,20 @@ class Client
1391
1393
 
1392
1394
  # stats
1393
1395
  when :stats
1394
- cd = it == 0 ? ''.freeze : it.to_s
1396
+ cd = it == 0 ? '' : it.to_s
1395
1397
 
1396
1398
  # huh?
1397
1399
  else
1398
1400
  raise NotImplementedError, sym.to_s
1399
1401
  end
1400
1402
 
1401
- cd ? (DivListItem % [cc, cd]) : ''.freeze
1403
+ cd ? (DivListItem % [cc, cd]) : ''
1402
1404
  end
1403
1405
 
1404
- DivListRow % cols.join(''.freeze)
1406
+ DivListRow % cols.join('')
1405
1407
  end
1406
1408
 
1407
- return DivList % [head, rows.join(''.freeze)]
1409
+ return DivList % [head, rows.join('')]
1408
1410
 
1409
1411
  end # def _div_list()
1410
1412
 
@@ -1412,56 +1414,56 @@ class Client
1412
1414
  # Search results list
1413
1415
  DivList = '
1414
1416
  <div class="list">%s%s
1415
- </div>'.freeze
1417
+ </div>'
1416
1418
 
1417
1419
  # Search results row
1418
1420
  DivListRow = '
1419
1421
  <div class="list-row">%s
1420
- </div>'.freeze
1422
+ </div>'
1421
1423
 
1422
1424
  # Search results header
1423
1425
  DivListHead = '
1424
1426
  <div class="list-head">%s
1425
- </div>'.freeze
1427
+ </div>'
1426
1428
 
1427
1429
  # Search results header items
1428
1430
  DivListHeadItems = {
1429
1431
  tags: '
1430
- <div class="list-int">Tags</div>'.freeze,
1432
+ <div class="list-int">Tags</div>',
1431
1433
  tag: '
1432
- <div class="list-tag">Tag</div>'.freeze,
1434
+ <div class="list-tag">Tag</div>',
1433
1435
  entry: '
1434
- <div class="list-int">Entry</div>'.freeze,
1436
+ <div class="list-int">Entry</div>',
1435
1437
  index: '
1436
- <div class="list-int">Index</div>'.freeze,
1438
+ <div class="list-int">Index</div>',
1437
1439
  action: '
1438
- <div class="list-int">Action</div>'.freeze,
1440
+ <div class="list-int">Action</div>',
1439
1441
  log: '
1440
- <div class="list-int">Log</div>'.freeze,
1442
+ <div class="list-int">Log</div>',
1441
1443
  title: '
1442
- <div class="list-title">Title</div>'.freeze,
1444
+ <div class="list-title">Title</div>',
1443
1445
  caseid: '
1444
- <div class="list-caseid">Case ID</div>'.freeze,
1446
+ <div class="list-caseid">Case ID</div>',
1445
1447
  stats: '
1446
- <div class="list-int">Stats</div>'.freeze,
1448
+ <div class="list-int">Stats</div>',
1447
1449
  time: '
1448
- <div class="list-time">Date/Time</div>'.freeze,
1450
+ <div class="list-time">Date/Time</div>',
1449
1451
  stat: '
1450
- <div class="list-stat">Stat Name</div>'.freeze,
1452
+ <div class="list-stat">Stat Name</div>',
1451
1453
  sum: '
1452
- <div class="list-float">Total</div>'.freeze,
1454
+ <div class="list-float">Total</div>',
1453
1455
  count: '
1454
- <div class="list-int">Count</div>'.freeze,
1456
+ <div class="list-int">Count</div>',
1455
1457
  files: '
1456
- <div class="list-int">Files</div>'.freeze,
1458
+ <div class="list-int">Files</div>',
1457
1459
  user: '
1458
- <div class="list-usergrp">User</div>'.freeze,
1459
- snippet: ''.freeze
1460
+ <div class="list-usergrp">User</div>',
1461
+ snippet: ''
1460
1462
  }.freeze
1461
1463
 
1462
1464
  # search results item
1463
1465
  DivListItem = '
1464
- <div class="%s">%s</div>'.freeze
1466
+ <div class="%s">%s</div>'
1465
1467
 
1466
1468
 
1467
1469
  ###############################################
@@ -1476,7 +1478,7 @@ class Client
1476
1478
  <div class="desc">
1477
1479
  <div class="desc-head">%s</div>
1478
1480
  %s
1479
- </div>'.freeze
1481
+ </div>'
1480
1482
 
1481
1483
 
1482
1484
  ###############################################
@@ -1512,7 +1514,7 @@ class Client
1512
1514
  disp_pages.times do |pg|
1513
1515
  page = pg + 1
1514
1516
  if page == cur
1515
- ary << '<b>%d</b>'.freeze % page
1517
+ ary << '<b>%d</b>' % page
1516
1518
  else
1517
1519
  query[:page] = page
1518
1520
  if pr
@@ -1526,30 +1528,30 @@ class Client
1526
1528
 
1527
1529
  # previous
1528
1530
  if cur == 1
1529
- prev_page = ''.freeze
1531
+ prev_page = ''
1530
1532
  else
1531
1533
  query[:page] = cur - 1
1532
1534
  if pr
1533
- prev_page = pr.call(query, '(Prev)'.freeze)
1535
+ prev_page = pr.call(query, '(Prev)')
1534
1536
  else
1535
- prev_page = yield(query, '(Prev)'.freeze)
1537
+ prev_page = yield(query, '(Prev)')
1536
1538
  end
1537
1539
  end
1538
1540
 
1539
1541
  # next
1540
1542
  if cur == disp_pages
1541
- next_page = ''.freeze
1543
+ next_page = ''
1542
1544
  else
1543
1545
  query[:page] = cur + 1
1544
1546
  if pr
1545
- next_page = pr.call(query, '(Next)'.freeze)
1547
+ next_page = pr.call(query, '(Next)')
1546
1548
  else
1547
- next_page = yield(query, '(Next)'.freeze)
1549
+ next_page = yield(query, '(Next)')
1548
1550
  end
1549
1551
  end
1550
1552
 
1551
1553
  return DivPage % [
1552
- prev_page, ary.join(' '.freeze), next_page,
1554
+ prev_page, ary.join(' '), next_page,
1553
1555
  hits, tot_pages
1554
1556
  ]
1555
1557
  end # def _div_page()
@@ -1560,7 +1562,7 @@ class Client
1560
1562
  <div class="pagenav">
1561
1563
  &lt;&lt; %s %s %s &gt;&gt;<br>
1562
1564
  Hits: %d Pages: %d
1563
- </div>'.freeze
1565
+ </div>'
1564
1566
 
1565
1567
 
1566
1568
  ###############################################
@@ -1581,61 +1583,61 @@ class Client
1581
1583
  grantee: ug,
1582
1584
  status: true,
1583
1585
  template: false,
1584
- purpose: 'Open Cases'.freeze
1585
- }, 'open'.freeze),
1586
+ purpose: 'Open Cases'
1587
+ }, 'open'),
1586
1588
  _a_case_search(env, {
1587
1589
  grantee: ug,
1588
1590
  status: false,
1589
1591
  template: false,
1590
- purpose: 'Closed Cases'.freeze
1591
- }, 'closed'.freeze),
1592
+ purpose: 'Closed Cases'
1593
+ }, 'closed'),
1592
1594
  _a_case_search(env, {
1593
1595
  grantee: ug,
1594
1596
  perm: ICFS::PermAction,
1595
1597
  status: true,
1596
1598
  template: false,
1597
- purpose: 'Action Manager Cases'.freeze
1598
- }, 'action mgr'.freeze),
1599
+ purpose: 'Action Manager Cases'
1600
+ }, 'action mgr'),
1599
1601
  _a_case_tags(env, {
1600
1602
  grantee: ug,
1601
1603
  status: true,
1602
1604
  template: false,
1603
- purpose: 'Open Case Tags'.freeze
1604
- }, 'tags'.freeze),
1605
- ].map{|lk| DivHomeLink % lk }.join(''.freeze)
1605
+ purpose: 'Open Case Tags'
1606
+ }, 'tags'),
1607
+ ].map{|lk| DivHomeLink % lk }.join('')
1606
1608
 
1607
1609
  al = [
1608
1610
  _a_action_search(env, {
1609
1611
  assigned: ug,
1610
1612
  status: true,
1611
1613
  flag: true,
1612
- purpose: 'Flagged Actions'.freeze
1613
- }, 'flagged'.freeze),
1614
+ purpose: 'Flagged Actions'
1615
+ }, 'flagged'),
1614
1616
  _a_action_search(env, {
1615
1617
  assigned: ug,
1616
1618
  status: true,
1617
1619
  before: now,
1618
- sort: 'time_asc'.freeze,
1619
- purpose: 'Actions - Past Date'.freeze,
1620
- }, 'past'.freeze),
1620
+ sort: 'time_asc',
1621
+ purpose: 'Actions - Past Date',
1622
+ }, 'past'),
1621
1623
  _a_action_search(env, {
1622
1624
  assigned: ug,
1623
1625
  status: true,
1624
1626
  after: now,
1625
- sort: 'time_desc'.freeze,
1626
- purpose: 'Actions - Future Date'.freeze,
1627
- }, 'future'.freeze),
1627
+ sort: 'time_desc',
1628
+ purpose: 'Actions - Future Date',
1629
+ }, 'future'),
1628
1630
  _a_action_search(env, {
1629
1631
  assigned: ug,
1630
1632
  status: true,
1631
- purpose: 'Open Actions'.freeze
1632
- }, 'all open'.freeze),
1633
+ purpose: 'Open Actions'
1634
+ }, 'all open'),
1633
1635
  _a_action_tags(env, {
1634
1636
  assigned: ug,
1635
1637
  status: true,
1636
- purpose: 'Open Action Tags'.freeze
1637
- }, 'tags'.freeze),
1638
- ].map{|lk| DivHomeLink % lk }.join(''.freeze)
1638
+ purpose: 'Open Action Tags'
1639
+ }, 'tags'),
1640
+ ].map{|lk| DivHomeLink % lk }.join('')
1639
1641
 
1640
1642
  ol = [
1641
1643
  _a_case_search(env, {
@@ -1643,27 +1645,27 @@ class Client
1643
1645
  perm: ICFS::PermManage,
1644
1646
  status: true,
1645
1647
  template: false,
1646
- purpose: 'Managed Cases'.freeze,
1647
- }, 'managed'.freeze),
1648
+ purpose: 'Managed Cases',
1649
+ }, 'managed'),
1648
1650
  _a_case_search(env, {
1649
1651
  grantee: ug,
1650
1652
  perm: ICFS::PermManage,
1651
1653
  status: true,
1652
1654
  template: true,
1653
- purpose: 'Templates'.freeze,
1654
- }, 'templates'.freeze),
1655
+ purpose: 'Templates',
1656
+ }, 'templates'),
1655
1657
  _a_stats(env, {
1656
1658
  credit: ug,
1657
1659
  after: Time.now.to_i - 60*60*24*30,
1658
- purpose: 'User/Role Stats - 30 days'.freeze,
1659
- }, '30-day stats'.freeze),
1660
- ].map{|lk| DivHomeLink % lk }.join(''.freeze)
1660
+ purpose: 'User/Role Stats - 30 days',
1661
+ }, '30-day stats'),
1662
+ ].map{|lk| DivHomeLink % lk }.join('')
1661
1663
 
1662
1664
 
1663
1665
  DivHomeUr % [Rack::Utils.escape_html(ug), al, cl, ol ]
1664
1666
  end
1665
1667
 
1666
- DivHome % useract.join(''.freeze)
1668
+ DivHome % useract.join('')
1667
1669
  end # def _div_home()
1668
1670
 
1669
1671
 
@@ -1676,7 +1678,7 @@ class Client
1676
1678
  <div class="list-text-s">Cases</div>
1677
1679
  <div class="list-text-s">Other</div>
1678
1680
  </div>%s
1679
- </div>'.freeze
1681
+ </div>'
1680
1682
 
1681
1683
 
1682
1684
  # Home user/role
@@ -1689,19 +1691,19 @@ class Client
1689
1691
  </div>
1690
1692
  <div class="links-list">%s
1691
1693
  </div>
1692
- </div>'.freeze
1694
+ </div>'
1693
1695
 
1694
1696
 
1695
1697
  # Home Link
1696
1698
  DivHomeLink = '
1697
- <div class="list-text-s">%s</div>'.freeze
1699
+ <div class="list-text-s">%s</div>'
1698
1700
 
1699
1701
 
1700
1702
  ###############################################
1701
1703
  # Case Create Form
1702
1704
  #
1703
1705
  def _form_create(env)
1704
- [ FormCaseCreate, ''.freeze ]
1706
+ [ FormCaseCreate, '' ]
1705
1707
  end # def _form_create()
1706
1708
 
1707
1709
 
@@ -1732,7 +1734,7 @@ class Client
1732
1734
  when making new cases.
1733
1735
  </div></div>
1734
1736
  </div>
1735
- </div>'.freeze
1737
+ </div>'
1736
1738
 
1737
1739
 
1738
1740
  ###############################################
@@ -1748,7 +1750,7 @@ class Client
1748
1750
  spath += Rack::Utils.escape(cid) if cid
1749
1751
  return DivForm % [
1750
1752
  spath,
1751
- parts.join(''.freeze),
1753
+ parts.join(''),
1752
1754
  button,
1753
1755
  ]
1754
1756
  end # def _div_form()
@@ -1759,7 +1761,7 @@ class Client
1759
1761
  enctype="multipart/form-data" accept-charset="utf-8">
1760
1762
  %s
1761
1763
  <input class="submit" type="submit" value="%s">
1762
- </form></div>'.freeze
1764
+ </form></div>'
1763
1765
 
1764
1766
 
1765
1767
 
@@ -1772,17 +1774,17 @@ class Client
1772
1774
  cid = cse['caseid']
1773
1775
  al = api.access_list(cid)
1774
1776
 
1775
- status = cse['status'] ? 'Open'.freeze : 'Closed'.freeze
1776
- template = cse['template'] ? 'Yes'.freeze : 'No'.freeze
1777
+ status = cse['status'] ? 'Open' : 'Closed'
1778
+ template = cse['template'] ? 'Yes' : 'No'
1777
1779
 
1778
1780
  # case links
1779
1781
  links = [
1780
- _a_log_search(env, {caseid: cid}, 'History of Case'.freeze),
1782
+ _a_log_search(env, {caseid: cid}, 'History of Case'),
1781
1783
  ]
1782
1784
  if al.include?(ICFS::PermManage)
1783
- links << _a_case_edit(env, cid, 'Edit This Case'.freeze)
1785
+ links << _a_case_edit(env, cid, 'Edit This Case')
1784
1786
  if cse['template']
1785
- links << _a_case_create(env, cid, 'Create New Case'.freeze)
1787
+ links << _a_case_create(env, cid, 'Create New Case')
1786
1788
  end
1787
1789
  end
1788
1790
  links.map!{|aa| DivCaseLink % aa}
@@ -1796,40 +1798,40 @@ class Client
1796
1798
  assigned: ICFS::UserCase,
1797
1799
  status: true,
1798
1800
  flag: true,
1799
- purpose: 'Flagged Actions'.freeze,
1800
- }, 'flagged'.freeze),
1801
+ purpose: 'Flagged Actions',
1802
+ }, 'flagged'),
1801
1803
  _a_action_search(env, {
1802
1804
  caseid: cid,
1803
1805
  assigned: ICFS::UserCase,
1804
1806
  status: true,
1805
1807
  before: now,
1806
- sort: 'time_asc'.freeze,
1807
- purpose: 'Actions - Past Date'.freeze,
1808
- }, 'past'.freeze),
1808
+ sort: 'time_asc',
1809
+ purpose: 'Actions - Past Date',
1810
+ }, 'past'),
1809
1811
  _a_action_search(env, {
1810
1812
  caseid: cid,
1811
1813
  assigned: ICFS::UserCase,
1812
1814
  status: true,
1813
1815
  after: now,
1814
- sort: 'time_desc'.freeze,
1815
- purpose: 'Actions - Future Date'.freeze,
1816
- }, 'future'.freeze),
1816
+ sort: 'time_desc',
1817
+ purpose: 'Actions - Future Date',
1818
+ }, 'future'),
1817
1819
  _a_action_search(env, {
1818
1820
  caseid: cid,
1819
1821
  assigned: ICFS::UserCase,
1820
1822
  status: true,
1821
- purpose: 'Open Actions'.freeze,
1822
- }, 'all open'.freeze),
1823
+ purpose: 'Open Actions',
1824
+ }, 'all open'),
1823
1825
  _a_action_tags(env, {
1824
1826
  caseid: cid,
1825
1827
  assigned: ICFS::UserCase,
1826
1828
  status: true,
1827
- purpose: 'Open Action Tags'.freeze,
1828
- }, 'tags'.freeze),
1829
+ purpose: 'Open Action Tags',
1830
+ }, 'tags'),
1829
1831
  ].map{|lk| DivCaseLink % lk}
1830
- actions = DivCaseActions % actions.join(''.freeze)
1832
+ actions = DivCaseActions % actions.join('')
1831
1833
  else
1832
- actions = ''.freeze
1834
+ actions = ''
1833
1835
  end
1834
1836
 
1835
1837
  # tags
@@ -1844,19 +1846,19 @@ class Client
1844
1846
  ugl = ac['grant'].map do |ug|
1845
1847
  DivCaseGrant % Rack::Utils.escape_html(ug)
1846
1848
  end
1847
- DivCaseAccess % [ pm, ugl.join(''.freeze) ]
1849
+ DivCaseAccess % [ pm, ugl.join('') ]
1848
1850
  end
1849
1851
 
1850
1852
  # stats
1851
1853
  if cse['stats']
1852
1854
  stats = cse['stats'].map do |st|
1853
1855
  DivCaseStatEach % _a_entry_search(env, { caseid: cid, stat: st,
1854
- purpose: 'Entries with Stat'.freeze },
1856
+ purpose: 'Entries with Stat' },
1855
1857
  Rack::Utils.escape_html(st) )
1856
1858
  end
1857
- stats = DivCaseStats % stats.join(''.freeze)
1859
+ stats = DivCaseStats % stats.join('')
1858
1860
  else
1859
- stats = ''.freeze
1861
+ stats = ''
1860
1862
  end
1861
1863
 
1862
1864
  return DivCase % [
@@ -1864,10 +1866,10 @@ class Client
1864
1866
  _a_log(env, cid, cse['log'], cse['log'].to_s),
1865
1867
  status,
1866
1868
  template,
1867
- links.join(''.freeze),
1869
+ links.join(''),
1868
1870
  Rack::Utils.escape_html(cse['title']),
1869
- acc.join(''.freeze),
1870
- tags.join(''.freeze),
1871
+ acc.join(''),
1872
+ tags.join(''),
1871
1873
  stats,
1872
1874
  actions,
1873
1875
  ]
@@ -1914,19 +1916,19 @@ class Client
1914
1916
  <div class="sect-head">Tags</div>%s
1915
1917
  </div>%s%s
1916
1918
  </div>
1917
- </div>'.freeze
1919
+ </div>'
1918
1920
 
1919
1921
 
1920
1922
  # Case div action links
1921
1923
  DivCaseActions = '
1922
1924
  <div class="sect">
1923
1925
  <div class="sect-head">Actions</div>%s
1924
- </div>'.freeze
1926
+ </div>'
1925
1927
 
1926
1928
 
1927
1929
  # Case div links
1928
1930
  DivCaseLink = '
1929
- <div>%s</div>'.freeze
1931
+ <div>%s</div>'
1930
1932
 
1931
1933
  # Case div each access
1932
1934
  DivCaseAccess = '
@@ -1934,17 +1936,17 @@ class Client
1934
1936
  <div class="list-perm">%s</div>
1935
1937
  <div class="list-vert list-usergrp">%s
1936
1938
  </div>
1937
- </div>'.freeze
1939
+ </div>'
1938
1940
 
1939
1941
 
1940
1942
  # Case div each grant
1941
1943
  DivCaseGrant = '
1942
- <div>%s</div>'.freeze
1944
+ <div>%s</div>'
1943
1945
 
1944
1946
 
1945
1947
  # Case div each tag
1946
1948
  DivCaseTag = '
1947
- <div class="item-tag">%s</div>'.freeze
1949
+ <div class="item-tag">%s</div>'
1948
1950
 
1949
1951
 
1950
1952
  # Case div stats section
@@ -1953,12 +1955,12 @@ class Client
1953
1955
  <div class="sect-head">Stats</div>
1954
1956
  <div class="list">%s
1955
1957
  </div>
1956
- </div>'.freeze
1958
+ </div>'
1957
1959
 
1958
1960
 
1959
1961
  # Case div each stat
1960
1962
  DivCaseStatEach = '
1961
- <div class="list-perm">%s</div>'.freeze
1963
+ <div class="list-perm">%s</div>'
1962
1964
 
1963
1965
 
1964
1966
  ###############################################
@@ -1971,21 +1973,21 @@ class Client
1971
1973
  links = []
1972
1974
 
1973
1975
  enum = ent['entry']
1974
- links << _a_entry_edit(env, cid, enum, 0, 'Edit This Entry'.freeze)
1976
+ links << _a_entry_edit(env, cid, enum, 0, 'Edit This Entry')
1975
1977
 
1976
1978
  lnum = ent['log']
1977
1979
  links << _a_log_search(env, {
1978
1980
  'caseid' => cid,
1979
1981
  'entry' => enum,
1980
- 'purpose' => 'History of Entry'.freeze,
1981
- }, 'History of Entry'.freeze)
1982
+ 'purpose' => 'History of Entry',
1983
+ }, 'History of Entry')
1982
1984
 
1983
1985
  if ent['action']
1984
1986
  anum = ent['action']
1985
1987
  action = DivEntryAction % _a_action(env, cid, anum, 0, anum.to_s)
1986
- links << _a_entry_edit(env, cid, 0, anum, 'New Entry in Action'.freeze)
1988
+ links << _a_entry_edit(env, cid, 0, anum, 'New Entry in Action')
1987
1989
  else
1988
- action = ''.freeze
1990
+ action = ''
1989
1991
  end
1990
1992
 
1991
1993
  if ent['index']
@@ -1993,16 +1995,16 @@ class Client
1993
1995
  idx = api.index_read(cid, xnum)
1994
1996
  DivEntryIndexEach % _a_index(env, cid, xnum, 0, idx['title'])
1995
1997
  end
1996
- index = DivEntryIndex % indexes.join(''.freeze)
1998
+ index = DivEntryIndex % indexes.join('')
1997
1999
  else
1998
- index = ''.freeze
2000
+ index = ''
1999
2001
  end
2000
2002
 
2001
2003
  tags = ent['tags'].map do |tag|
2002
2004
  DivEntryTag % _a_entry_search(env, {
2003
2005
  'caseid' => cid,
2004
2006
  'tags' => tag,
2005
- 'purpose' => 'Tag Entries'.freeze,
2007
+ 'purpose' => 'Tag Entries',
2006
2008
  }, tag)
2007
2009
  end
2008
2010
 
@@ -2010,9 +2012,9 @@ class Client
2010
2012
  pa = ent['perms'].map do |pm|
2011
2013
  DivEntryPermEach % Rack::Utils.escape_html(pm)
2012
2014
  end
2013
- perms = DivEntryPerms % pa.join("\n".freeze)
2015
+ perms = DivEntryPerms % pa.join("\n")
2014
2016
  else
2015
- perms = ''.freeze
2017
+ perms = ''
2016
2018
  end
2017
2019
 
2018
2020
  if ent['stats']
@@ -2023,12 +2025,12 @@ class Client
2023
2025
  DivEntryStatEach % [
2024
2026
  Rack::Utils.escape_html(st['name']),
2025
2027
  st['value'],
2026
- ca.join(', '.freeze)
2028
+ ca.join(', ')
2027
2029
  ]
2028
2030
  end
2029
- stats = DivEntryStats % sa.join("\n".freeze)
2031
+ stats = DivEntryStats % sa.join("\n")
2030
2032
  else
2031
- stats = ''.freeze
2033
+ stats = ''
2032
2034
  end
2033
2035
 
2034
2036
  if ent['files']
@@ -2036,9 +2038,9 @@ class Client
2036
2038
  DivEntryFileEach % _a_file(env, cid, enum, fd['log'],
2037
2039
  fd['num'], fd['name'], fd['name'])
2038
2040
  end
2039
- files = DivEntryFiles % fa.join("\n".freeze)
2041
+ files = DivEntryFiles % fa.join("\n")
2040
2042
  else
2041
- files = ''.freeze
2043
+ files = ''
2042
2044
  end
2043
2045
 
2044
2046
  return DivEntry % [
@@ -2047,11 +2049,11 @@ class Client
2047
2049
  _a_log(env, cid, lnum, lnum.to_s),
2048
2050
  Rack::Utils.escape_html(ent['user']),
2049
2051
  action,
2050
- links.map{|lk| DivEntryLink % lk }.join(''.freeze),
2052
+ links.map{|lk| DivEntryLink % lk }.join(''),
2051
2053
  Rack::Utils.escape_html(ent['title']),
2052
2054
  _util_time(env, ent['time']),
2053
2055
  Rack::Utils.escape_html(ent['content']),
2054
- tags.join("\n".freeze),
2056
+ tags.join("\n"),
2055
2057
  index,
2056
2058
  perms,
2057
2059
  stats,
@@ -2096,17 +2098,17 @@ class Client
2096
2098
  </div>
2097
2099
  </div>%s%s%s%s
2098
2100
  </div>
2099
- </div>'.freeze
2101
+ </div>'
2100
2102
 
2101
2103
 
2102
2104
  # entry tag each
2103
2105
  DivEntryTag = '
2104
- <div>%s</div>'.freeze
2106
+ <div>%s</div>'
2105
2107
 
2106
2108
 
2107
2109
  # entry link each
2108
2110
  DivEntryLink = '
2109
- <div>%s</div>'.freeze
2111
+ <div>%s</div>'
2110
2112
 
2111
2113
 
2112
2114
  # entry action
@@ -2114,7 +2116,7 @@ class Client
2114
2116
  <div class="list-row">
2115
2117
  <div class="list-label">Action:</div>
2116
2118
  <div class="list-int">%s</div>
2117
- </div>'.freeze
2119
+ </div>'
2118
2120
 
2119
2121
 
2120
2122
  # entry index
@@ -2123,12 +2125,12 @@ class Client
2123
2125
  <div class="sect-head">Indexes</div>
2124
2126
  <div class="index-list">%s
2125
2127
  </div>
2126
- </div>'.freeze
2128
+ </div>'
2127
2129
 
2128
2130
 
2129
2131
  # entry index each
2130
2132
  DivEntryIndexEach = '
2131
- <div>%s</div>'.freeze
2133
+ <div>%s</div>'
2132
2134
 
2133
2135
 
2134
2136
  # entry perms
@@ -2137,12 +2139,12 @@ class Client
2137
2139
  <div class="sect-head">Permissions</div>
2138
2140
  <div class="perms-list">%s
2139
2141
  </div>
2140
- </div>'.freeze
2142
+ </div>'
2141
2143
 
2142
2144
 
2143
2145
  # entry perm each
2144
2146
  DivEntryPermEach = '
2145
- <div>%s</div>'.freeze
2147
+ <div>%s</div>'
2146
2148
 
2147
2149
 
2148
2150
  # entry stats
@@ -2151,12 +2153,12 @@ class Client
2151
2153
  <div class="sect-head">Stats</div>
2152
2154
  <div class="stats-list">%s
2153
2155
  </div>
2154
- </div>'.freeze
2156
+ </div>'
2155
2157
 
2156
2158
 
2157
2159
  # entry each stat
2158
2160
  DivEntryStatEach = '
2159
- <div>%s %f %s</div>'.freeze
2161
+ <div>%s %f %s</div>'
2160
2162
 
2161
2163
 
2162
2164
  # entry files
@@ -2165,12 +2167,12 @@ class Client
2165
2167
  <div class="sect-head">Files</div>
2166
2168
  <div class="files-list">%s
2167
2169
  </div>
2168
- </div>'.freeze
2170
+ </div>'
2169
2171
 
2170
2172
 
2171
2173
  # entry each file
2172
2174
  DivEntryFileEach = '
2173
- <div>%s</div>'.freeze
2175
+ <div>%s</div>'
2174
2176
 
2175
2177
 
2176
2178
  ###############################################
@@ -2181,15 +2183,15 @@ class Client
2181
2183
  lnum = log['log']
2182
2184
  enum = log['entry']['num']
2183
2185
 
2184
- navp = (lnum == 1) ? 'prev'.freeze : _a_log(env, cid, lnum-1, 'prev'.freeze)
2185
- navn = _a_log(env, cid, lnum + 1, 'next'.freeze)
2186
+ navp = (lnum == 1) ? 'prev' : _a_log(env, cid, lnum-1, 'prev')
2187
+ navn = _a_log(env, cid, lnum + 1, 'next')
2186
2188
 
2187
2189
  time = _util_time(env, log['time'])
2188
2190
 
2189
2191
  if log['case_hash']
2190
2192
  chash = DivLogCase % _a_case(env, cid, lnum, log['case_hash'])
2191
2193
  else
2192
- chash = ''.freeze
2194
+ chash = ''
2193
2195
  end
2194
2196
 
2195
2197
  if log['action']
@@ -2198,7 +2200,7 @@ class Client
2198
2200
  log['action']['num'],
2199
2201
  ]
2200
2202
  else
2201
- action = ''.freeze
2203
+ action = ''
2202
2204
  end
2203
2205
 
2204
2206
  if log['index']
@@ -2207,7 +2209,7 @@ class Client
2207
2209
  log['index']['num'],
2208
2210
  ]
2209
2211
  else
2210
- index = ''.freeze
2212
+ index = ''
2211
2213
  end
2212
2214
 
2213
2215
  if log['files_hash']
@@ -2215,13 +2217,13 @@ class Client
2215
2217
  fa = []
2216
2218
  ha.each_index do |ix|
2217
2219
  fa << DivLogFileEach % [
2218
- _a_file(env, cid, enum, lnum, ix, 'file.bin'.freeze, ha[ix]),
2220
+ _a_file(env, cid, enum, lnum, ix, 'file.bin', ha[ix]),
2219
2221
  ix
2220
2222
  ]
2221
2223
  end
2222
- files = DivLogFiles % fa.join("\n".freeze)
2224
+ files = DivLogFiles % fa.join("\n")
2223
2225
  else
2224
- files = ''.freeze
2226
+ files = ''
2225
2227
  end
2226
2228
 
2227
2229
  return DivLog % [
@@ -2280,7 +2282,7 @@ class Client
2280
2282
  <div class="list-int">%d</div>
2281
2283
  </div>%s%s%s%s
2282
2284
  </div>
2283
- </div>'.freeze
2285
+ </div>'
2284
2286
 
2285
2287
 
2286
2288
  # log action
@@ -2289,7 +2291,7 @@ class Client
2289
2291
  <div class="list-label">Action:</div>
2290
2292
  <div class="list-hash">%s</div>
2291
2293
  <div class="list-int">%d</div>
2292
- </div>'.freeze
2294
+ </div>'
2293
2295
 
2294
2296
 
2295
2297
  # log index
@@ -2298,7 +2300,7 @@ class Client
2298
2300
  <div class="list-label">Index:</div>
2299
2301
  <div class="list-hash">%s</div>
2300
2302
  <div class="list-int">%d</div>
2301
- </div>'.freeze
2303
+ </div>'
2302
2304
 
2303
2305
 
2304
2306
  # log case
@@ -2307,7 +2309,7 @@ class Client
2307
2309
  <div class="list-label">Case:</div>
2308
2310
  <div class="list-hash">%s</div>
2309
2311
  </div>
2310
- '.freeze
2312
+ '
2311
2313
 
2312
2314
  # log file
2313
2315
  DivLogFiles = '
@@ -2315,7 +2317,7 @@ class Client
2315
2317
  <div class="list-label">Files:</div>
2316
2318
  <div class="files-list">%s
2317
2319
  </div>
2318
- </div>'.freeze
2320
+ </div>'
2319
2321
 
2320
2322
 
2321
2323
  # log file
@@ -2323,7 +2325,7 @@ class Client
2323
2325
  <div>
2324
2326
  <div class="list-hash">%s</div>
2325
2327
  <div class="list-int">%d</div>
2326
- </div>'.freeze
2328
+ </div>'
2327
2329
 
2328
2330
 
2329
2331
  ###############################################
@@ -2342,14 +2344,14 @@ class Client
2342
2344
 
2343
2345
  links = []
2344
2346
  anum = act['action']
2345
- links << _a_entry_edit(env, cid, 0, anum, 'New Entry in Action'.freeze)
2347
+ links << _a_entry_edit(env, cid, 0, anum, 'New Entry in Action')
2346
2348
 
2347
2349
  lnum = act['log']
2348
2350
  links << _a_log_search(env, {
2349
2351
  'caseid' => cid,
2350
2352
  'action' => anum,
2351
- 'purpose' => 'Action History'.freeze,
2352
- }, 'History of Action'.freeze)
2353
+ 'purpose' => 'Action History',
2354
+ }, 'History of Action')
2353
2355
 
2354
2356
  # each task
2355
2357
  tasks = []
@@ -2372,13 +2374,13 @@ class Client
2372
2374
  end
2373
2375
 
2374
2376
  tasks << DivActionTask % [
2375
- edit ? 'task-ed'.freeze : 'task-ro'.freeze,
2377
+ edit ? 'task-ed' : 'task-ro',
2376
2378
  Rack::Utils.escape_html(tk['assigned']),
2377
2379
  Rack::Utils.escape_html(tk['title']),
2378
- tk['status'] ? 'Open'.freeze : 'Closed'.freeze,
2379
- tk['flag'] ? 'Raised'.freeze : 'Normal'.freeze,
2380
+ tk['status'] ? 'Open' : 'Closed',
2381
+ tk['flag'] ? 'Raised' : 'Normal',
2380
2382
  _util_time(env, tk['time']),
2381
- tags.join(''.freeze),
2383
+ tags.join(''),
2382
2384
  ]
2383
2385
  end
2384
2386
 
@@ -2386,8 +2388,8 @@ class Client
2386
2388
  _a_case(env, cid, 0, cid),
2387
2389
  _a_action(env, cid, anum, 0, anum.to_s),
2388
2390
  _a_log(env, cid, lnum, lnum.to_s),
2389
- links.map{|lk| DivActionLink % lk }.join(''.freeze),
2390
- tasks.join(''.freeze)
2391
+ links.map{|lk| DivActionLink % lk }.join(''),
2392
+ tasks.join('')
2391
2393
  ]
2392
2394
  end # def _div_action()
2393
2395
 
@@ -2419,12 +2421,12 @@ class Client
2419
2421
  <div class="sbar-main">%s
2420
2422
  </div>
2421
2423
 
2422
- </div>'.freeze
2424
+ </div>'
2423
2425
 
2424
2426
 
2425
2427
  # Action link
2426
2428
  DivActionLink = '
2427
- <div>%s</div>'.freeze
2429
+ <div>%s</div>'
2428
2430
 
2429
2431
 
2430
2432
  # Action task
@@ -2455,12 +2457,12 @@ class Client
2455
2457
  <div class="list-vert">%s
2456
2458
  </div>
2457
2459
  </div>
2458
- </div>'.freeze
2460
+ </div>'
2459
2461
 
2460
2462
 
2461
2463
  # Action Tag
2462
2464
  DivActionTag = '
2463
- <div>%s</div>'.freeze
2465
+ <div>%s</div>'
2464
2466
 
2465
2467
 
2466
2468
  ###############################################
@@ -2471,20 +2473,20 @@ class Client
2471
2473
 
2472
2474
  links = []
2473
2475
  xnum = idx['index']
2474
- links << _a_index_edit(env, cid, xnum, 'Edit This Index'.freeze)
2476
+ links << _a_index_edit(env, cid, xnum, 'Edit This Index')
2475
2477
 
2476
2478
  lnum = idx['log']
2477
2479
  links << _a_log_search(env, {
2478
2480
  'caseid' => cid,
2479
2481
  'index' => xnum,
2480
- 'purpose' => 'Index History'.freeze,
2482
+ 'purpose' => 'Index History',
2481
2483
  }, 'History of Index')
2482
2484
 
2483
2485
  tags = idx['tags'].map do |tg|
2484
2486
  DivIndexTag % _a_index_search(env, {
2485
2487
  'caseid' => cid,
2486
2488
  'tags' => tg,
2487
- 'purpose' => 'Index Entries'.freeze,
2489
+ 'purpose' => 'Index Entries',
2488
2490
  }, tg)
2489
2491
  end
2490
2492
 
@@ -2492,10 +2494,10 @@ class Client
2492
2494
  _a_case(env, cid, 0, cid),
2493
2495
  _a_index(env, cid, xnum, 0, xnum.to_s),
2494
2496
  _a_log(env, cid, lnum, lnum.to_s),
2495
- links.map{|lk| DivIndexLink % lk }.join(''.freeze),
2497
+ links.map{|lk| DivIndexLink % lk }.join(''),
2496
2498
  Rack::Utils.escape_html(idx['title']),
2497
2499
  Rack::Utils.escape_html(idx['content']),
2498
- tags.join(''.freeze),
2500
+ tags.join(''),
2499
2501
  ]
2500
2502
  end # def _div_index()
2501
2503
 
@@ -2531,16 +2533,16 @@ class Client
2531
2533
  </div>
2532
2534
  </div>
2533
2535
  </div>
2534
- </div>'.freeze
2536
+ </div>'
2535
2537
 
2536
2538
 
2537
2539
  # Index Links
2538
2540
  DivIndexLink = '
2539
- <div>%s</div>'.freeze
2541
+ <div>%s</div>'
2540
2542
 
2541
2543
  # Index tags
2542
2544
  DivIndexTag = '
2543
- <div>%s</div>'.freeze
2545
+ <div>%s</div>'
2544
2546
 
2545
2547
 
2546
2548
  ###############################################
@@ -2565,7 +2567,7 @@ class Client
2565
2567
  when :string
2566
2568
  para = Rack::Utils.escape_html(val)
2567
2569
  when :boolean
2568
- para = val ? 'true'.freeze : 'false'.freeze
2570
+ para = val ? 'true' : 'false'
2569
2571
  when :integer
2570
2572
  para = val.to_s
2571
2573
  when :time
@@ -2574,16 +2576,16 @@ class Client
2574
2576
  raise NotImplementedError, pr.to_s
2575
2577
  end
2576
2578
 
2577
- list << '<i>%s:</i> %s'.freeze % [sym, para]
2579
+ list << '<i>%s:</i> %s' % [sym, para]
2578
2580
  end
2579
2581
  if list.empty?
2580
- paras = ''.freeze
2582
+ paras = ''
2581
2583
  else
2582
- paras = ' &ndash; ' + list.join(', '.freeze)
2584
+ paras = ' &ndash; ' + list.join(', ')
2583
2585
  end
2584
2586
 
2585
2587
  # enable value
2586
- value = disp ? 'true'.freeze : 'false'.freeze
2588
+ value = disp ? 'true' : 'false'
2587
2589
 
2588
2590
  return _div_desc(purp, DivQuery % [ type, paras, value ])
2589
2591
  end # def _div_query()
@@ -2599,7 +2601,7 @@ class Client
2599
2601
  Click to display search form.
2600
2602
  </div></div>
2601
2603
  %s
2602
- <input name="que-enable" id="que-ena" type="hidden" value="%s">'.freeze
2604
+ <input name="que-enable" id="que-ena" type="hidden" value="%s">'
2603
2605
 
2604
2606
 
2605
2607
  ###########################################################
@@ -2617,114 +2619,114 @@ class Client
2617
2619
 
2618
2620
  case sym
2619
2621
  when :caseid
2620
- ilabel = 'Case ID'.freeze
2621
- iclass = 'form-caseid'.freeze
2622
- ihint = 'Filter for a specific case.'.freeze
2622
+ ilabel = 'Case ID'
2623
+ iclass = 'form-caseid'
2624
+ ihint = 'Filter for a specific case.'
2623
2625
  when :title
2624
- ilabel = 'Title'.freeze
2625
- iclass = 'form-title'.freeze
2626
- ihint = 'Text search within the title.'.freeze
2626
+ ilabel = 'Title'
2627
+ iclass = 'form-title'
2628
+ ihint = 'Text search within the title.'
2627
2629
  when :prefix
2628
- ilabel = 'Prefix'.freeze
2629
- iclass = 'form-title'.freeze
2630
- ihint = 'Filter for titles starting with fixed text.'.freeze
2630
+ ilabel = 'Prefix'
2631
+ iclass = 'form-title'
2632
+ ihint = 'Filter for titles starting with fixed text.'
2631
2633
  when :content
2632
- ilabel = 'Content'.freeze
2633
- iclass = 'form-content'.freeze
2634
- ihint = 'Text search within the content.'.freeze
2634
+ ilabel = 'Content'
2635
+ iclass = 'form-content'
2636
+ ihint = 'Text search within the content.'
2635
2637
  when :tags
2636
- ilabel = 'Tag'.freeze
2637
- iclass = 'form-tag'.freeze
2638
- ihint = 'Filter for only a specific tag.'.freeze
2638
+ ilabel = 'Tag'
2639
+ iclass = 'form-tag'
2640
+ ihint = 'Filter for only a specific tag.'
2639
2641
  when :action
2640
- ilabel = 'Action'.freeze
2641
- iclass = 'form-int'.freeze
2642
- ihint = 'Filter for a specific action (by number).'.freeze
2642
+ ilabel = 'Action'
2643
+ iclass = 'form-int'
2644
+ ihint = 'Filter for a specific action (by number).'
2643
2645
  when :before
2644
- ilabel = 'Before'.freeze
2645
- iclass = 'form-time'.freeze
2646
- ihint = 'Filter for items occuring before this date and time.'.freeze
2646
+ ilabel = 'Before'
2647
+ iclass = 'form-time'
2648
+ ihint = 'Filter for items occuring before this date and time.'
2647
2649
  when :after
2648
- ilabel = 'After'.freeze
2649
- iclass = 'form-time'.freeze
2650
- ihint = 'Filter for items occuring after this date and time.'.freeze
2650
+ ilabel = 'After'
2651
+ iclass = 'form-time'
2652
+ ihint = 'Filter for items occuring after this date and time.'
2651
2653
  when :credit
2652
- ilabel = 'Credit'.freeze
2653
- iclass = 'form-usergrp'.freeze
2654
- ihint = 'Filter for stats crediting this user or role.'.freeze
2654
+ ilabel = 'Credit'
2655
+ iclass = 'form-usergrp'
2656
+ ihint = 'Filter for stats crediting this user or role.'
2655
2657
  when :size
2656
- ilabel = 'Size'.freeze
2657
- iclass = 'form-int'.freeze
2658
- ihint = 'Number of results to be returned per page.'.freeze
2658
+ ilabel = 'Size'
2659
+ iclass = 'form-int'
2660
+ ihint = 'Number of results to be returned per page.'
2659
2661
  when :page
2660
2662
  next
2661
2663
  when :sort
2662
- ilabel = 'Sort'.freeze
2663
- iclass = 'form-sort'.freeze
2664
- ihint = 'How to sort the results.'.freeze
2664
+ ilabel = 'Sort'
2665
+ iclass = 'form-sort'
2666
+ ihint = 'How to sort the results.'
2665
2667
  when :purpose
2666
2668
  next
2667
2669
  when :user
2668
- ilabel = 'User'.freeze
2669
- iclass = 'form-usergrp'.freeze
2670
- ihint = 'Filter for logs authored by this user.'.freeze
2670
+ ilabel = 'User'
2671
+ iclass = 'form-usergrp'
2672
+ ihint = 'Filter for logs authored by this user.'
2671
2673
  when :grantee
2672
- ilabel = 'Grantee'.freeze
2673
- iclass = 'form-usergrp'.freeze
2674
- ihint = 'Filter for cases granting this user or role a permission.'.freeze
2674
+ ilabel = 'Grantee'
2675
+ iclass = 'form-usergrp'
2676
+ ihint = 'Filter for cases granting this user or role a permission.'
2675
2677
  when :perm
2676
- ilabel = 'Permission'.freeze
2677
- iclass = 'form-perm'.freeze
2678
- ihint = 'Filter for cases granting this permission.'.freeze
2678
+ ilabel = 'Permission'
2679
+ iclass = 'form-perm'
2680
+ ihint = 'Filter for cases granting this permission.'
2679
2681
  when :entry
2680
- ilabel = 'Entry'.freeze
2681
- iclass = 'form-int'.freeze
2682
- ihint = 'Filter for logs recording specified entry (by number).'.freeze
2682
+ ilabel = 'Entry'
2683
+ iclass = 'form-int'
2684
+ ihint = 'Filter for logs recording specified entry (by number).'
2683
2685
  when :index
2684
- ilabel = 'Index'.freeze
2685
- iclass = 'form-int'.freeze
2686
- ihint = 'Filter for specified index (by number).'.freeze
2686
+ ilabel = 'Index'
2687
+ iclass = 'form-int'
2688
+ ihint = 'Filter for specified index (by number).'
2687
2689
  when :assigned
2688
- ilabel = 'Assigned'.freeze
2689
- iclass = 'form-usergrp'.freeze
2690
- ihint = 'Filter for tasks assigned to specified user or role.'.freeze
2690
+ ilabel = 'Assigned'
2691
+ iclass = 'form-usergrp'
2692
+ ihint = 'Filter for tasks assigned to specified user or role.'
2691
2693
  when :status
2692
- ilabel = 'Status'.freeze
2693
- iclass = 'form-boolean'.freeze
2694
- ihint = 'Filter for open items. Use true or false.'.freeze
2694
+ ilabel = 'Status'
2695
+ iclass = 'form-boolean'
2696
+ ihint = 'Filter for open items. Use true or false.'
2695
2697
  when :flag
2696
- ilabel = 'Flag'.freeze
2697
- iclass = 'form-boolean'.freeze
2698
- ihint = 'Filter for flagged tasks. Use true or false.'.freeze
2698
+ ilabel = 'Flag'
2699
+ iclass = 'form-boolean'
2700
+ ihint = 'Filter for flagged tasks. Use true or false.'
2699
2701
  when :template
2700
- ilabel = 'Template'.freeze
2701
- iclass = 'form-boolean'.freeze
2702
- ihint = 'Filter for template cases. Use true or false.'.freeze
2702
+ ilabel = 'Template'
2703
+ iclass = 'form-boolean'
2704
+ ihint = 'Filter for template cases. Use true or false.'
2703
2705
  when :stat
2704
- ilabel = 'Stat'.freeze
2705
- iclass = 'form-boolean'.freeze
2706
- ihint = 'Filter for stats by name. Use true or false.'.freeze
2706
+ ilabel = 'Stat'
2707
+ iclass = 'form-boolean'
2708
+ ihint = 'Filter for stats by name. Use true or false.'
2707
2709
  else
2708
2710
  raise NotImplementedError, sym.to_s
2709
2711
  end
2710
2712
 
2711
2713
  case pr
2712
2714
  when :string
2713
- itype = 'text'.freeze
2714
- ivalue = query[sym] || ''.freeze
2715
+ itype = 'text'
2716
+ ivalue = query[sym] || ''
2715
2717
  when :boolean
2716
- itype = 'text'.freeze
2718
+ itype = 'text'
2717
2719
  if query[sym].nil?
2718
- ivalue = ''.freeze
2720
+ ivalue = ''
2719
2721
  else
2720
- ivalue = query[sym] ? 'true'.freeze : 'false'.freeze
2722
+ ivalue = query[sym] ? 'true' : 'false'
2721
2723
  end
2722
2724
  when :integer
2723
- itype = 'text'.freeze
2725
+ itype = 'text'
2724
2726
  ivalue = query[sym] ? query[sym].to_s : ''
2725
2727
  when :time
2726
- itype = 'text'.freeze
2727
- ivalue = query[sym] ? _util_time(env, query[sym]) : ''.freeze
2728
+ itype = 'text'
2729
+ ivalue = query[sym] ? _util_time(env, query[sym]) : ''
2728
2730
  else
2729
2731
  raise NotImplementedError, pr.to_s
2730
2732
  end
@@ -2733,12 +2735,12 @@ class Client
2733
2735
  end
2734
2736
 
2735
2737
  # display the form
2736
- formClass = disp ? ''.freeze : ' hidden'.freeze
2738
+ formClass = disp ? '' : ' hidden'
2737
2739
 
2738
2740
  return FormQuery % [
2739
2741
  formClass,
2740
2742
  act,
2741
- inputs.join(''.freeze)
2743
+ inputs.join('')
2742
2744
  ]
2743
2745
  end # def _form_query
2744
2746
 
@@ -2747,7 +2749,7 @@ class Client
2747
2749
  FormQuery = '
2748
2750
  <div class="form%s" id="que-form"><form method="get" action="%s">%s
2749
2751
  <input class="submit" type="submit" value="Search">
2750
- </form></div>'.freeze
2752
+ </form></div>'
2751
2753
 
2752
2754
 
2753
2755
  # Query form item
@@ -2758,14 +2760,14 @@ class Client
2758
2760
  <div class="tip"><div class="tip-disp"></div><div class="tip-info">
2759
2761
  %s
2760
2762
  </div></div>
2761
- </div>'.freeze
2763
+ </div>'
2762
2764
 
2763
2765
 
2764
2766
  ###############################################
2765
2767
  # Case form
2766
2768
  def _form_case(env, cse)
2767
2769
 
2768
- status = ' checked'.freeze if cse['status']
2770
+ status = ' checked' if cse['status']
2769
2771
 
2770
2772
  # tags
2771
2773
  tags_cnt = 0
@@ -2774,9 +2776,9 @@ class Client
2774
2776
  tags_cnt = tags_cnt + 1
2775
2777
  FormCaseTag % [ tags_cnt, Rack::Utils.escape_html(tg) ]
2776
2778
  end
2777
- tags = tags_list.join(''.freeze)
2779
+ tags = tags_list.join('')
2778
2780
  else
2779
- tags = ''.freeze
2781
+ tags = ''
2780
2782
  end
2781
2783
 
2782
2784
  # stats
@@ -2786,9 +2788,9 @@ class Client
2786
2788
  stats_cnt += 1
2787
2789
  FormCaseStat % [stats_cnt, Rack::Utils.escape_html(st)]
2788
2790
  end
2789
- stats = stats_list.join(''.freeze)
2791
+ stats = stats_list.join('')
2790
2792
  else
2791
- stats = ''.freeze
2793
+ stats = ''
2792
2794
  end
2793
2795
 
2794
2796
  # access
@@ -2807,7 +2809,7 @@ class Client
2807
2809
  FormCaseAccess % [
2808
2810
  acc_cnt, grant_cnt,
2809
2811
  acc_cnt, Rack::Utils.escape_html(ad['perm']),
2810
- grants.join(''.freeze),
2812
+ grants.join(''),
2811
2813
  ]
2812
2814
  end
2813
2815
 
@@ -2815,7 +2817,7 @@ class Client
2815
2817
  Rack::Utils.escape_html(cse['title']),
2816
2818
  status,
2817
2819
  tags_cnt, tags,
2818
- acc_cnt, acc_list.join(''.freeze),
2820
+ acc_cnt, acc_list.join(''),
2819
2821
  stats_cnt, stats,
2820
2822
  ]
2821
2823
  end # def _form_case()
@@ -2898,7 +2900,7 @@ class Client
2898
2900
  <div class="stat-list" id="cse-stat-list">
2899
2901
  <input type="hidden" name="cse-stat" value="%d">%s
2900
2902
  </div>
2901
- </div>'.freeze
2903
+ </div>'
2902
2904
 
2903
2905
 
2904
2906
  # Case form Tag each
@@ -2907,7 +2909,7 @@ class Client
2907
2909
  <input class="form-tag" type="text" name="cse-tag-%d" value="%s">
2908
2910
  <button class="form-del" type="button" onclick="delDiv(this)">X
2909
2911
  </button>
2910
- </div>'.freeze
2912
+ </div>'
2911
2913
 
2912
2914
 
2913
2915
  # Case form Stat each
@@ -2916,7 +2918,7 @@ class Client
2916
2918
  <input class="form-stat" type="text" name="cse-stat-%d" value="%s">
2917
2919
  <button class="form-del" type="button" onclick="delDiv(this)">X
2918
2920
  </button>
2919
- </div>'.freeze
2921
+ </div>'
2920
2922
 
2921
2923
 
2922
2924
  # Case form Access each
@@ -2930,14 +2932,14 @@ class Client
2930
2932
  <button class="add-grant" type="button"
2931
2933
  onclick="cseAddGrant(this)">+
2932
2934
  </button>
2933
- </div>'.freeze
2935
+ </div>'
2934
2936
 
2935
2937
  # Case form Grant each
2936
2938
  FormCaseGrant = '
2937
2939
  <div>
2938
2940
  <input class="form-usergrp" type="text" name="cse-acc-%d-%d"
2939
2941
  value="%s">
2940
- </div>'.freeze
2942
+ </div>'
2941
2943
 
2942
2944
 
2943
2945
  #############################################
@@ -2950,21 +2952,21 @@ class Client
2950
2952
  if ent && ent['title']
2951
2953
  title = Rack::Utils.escape_html(ent['title'])
2952
2954
  else
2953
- title = ''.freeze
2955
+ title = ''
2954
2956
  end
2955
2957
 
2956
2958
  # time
2957
2959
  if ent && ent['time']
2958
2960
  time = _util_time(env, ent['time'])
2959
2961
  else
2960
- time = ''.freeze
2962
+ time = ''
2961
2963
  end
2962
2964
 
2963
2965
  # content
2964
2966
  if ent && ent['content']
2965
2967
  content = Rack::Utils.escape_html(ent['content'])
2966
2968
  else
2967
- content = ''.freeze
2969
+ content = ''
2968
2970
  end
2969
2971
 
2970
2972
  # files
@@ -2979,9 +2981,9 @@ class Client
2979
2981
  files_cnt, fd['num'], fd['log']
2980
2982
  ]
2981
2983
  end
2982
- files = files_list.join("\n".freeze)
2984
+ files = files_list.join("\n")
2983
2985
  else
2984
- files = ''.freeze
2986
+ files = ''
2985
2987
  end
2986
2988
 
2987
2989
  # tags
@@ -2991,9 +2993,9 @@ class Client
2991
2993
  tags_cnt = tags_cnt + 1
2992
2994
  FormEntryTagEach % [tags_cnt, Rack::Utils.escape_html(tg)]
2993
2995
  end
2994
- tags = tags_list.join(''.freeze)
2996
+ tags = tags_list.join('')
2995
2997
  else
2996
- tags = ''.freeze
2998
+ tags = ''
2997
2999
  end
2998
3000
 
2999
3001
  # indexes
@@ -3007,9 +3009,9 @@ class Client
3007
3009
  Rack::Utils.escape_html(idx['title'])
3008
3010
  ]
3009
3011
  end
3010
- index = idx_list.join(''.freeze)
3012
+ index = idx_list.join('')
3011
3013
  else
3012
- index = ''.freeze
3014
+ index = ''
3013
3015
  end
3014
3016
 
3015
3017
  # stats select
@@ -3017,7 +3019,7 @@ class Client
3017
3019
  esc = Rack::Utils.escape_html(stat)
3018
3020
  FormEntryStatOpt % [esc, esc]
3019
3021
  end
3020
- stats_sel = FormEntryStatSel % stats_sel.join(''.freeze)
3022
+ stats_sel = FormEntryStatSel % stats_sel.join('')
3021
3023
 
3022
3024
  # stats count & list
3023
3025
  stats_cnt = 0
@@ -3038,12 +3040,12 @@ class Client
3038
3040
  stats_cnt, claim_cnt,
3039
3041
  stats_cnt, esc, esc,
3040
3042
  stats_cnt, st['value'].to_s,
3041
- claims.join(''.freeze)
3043
+ claims.join('')
3042
3044
  ]
3043
3045
  end
3044
- stats = stats_list.join(''.freeze)
3046
+ stats = stats_list.join('')
3045
3047
  else
3046
- stats = ''.freeze
3048
+ stats = ''
3047
3049
  end
3048
3050
 
3049
3051
  # perms select
@@ -3052,7 +3054,7 @@ class Client
3052
3054
  esc = Rack::Utils.escape_html(pm)
3053
3055
  FormEntryPermOpt % [esc, esc]
3054
3056
  end
3055
- perms_sel = perms_sel.join(''.freeze)
3057
+ perms_sel = perms_sel.join('')
3056
3058
 
3057
3059
  # perms count & list
3058
3060
  perms_cnt = 0
@@ -3062,9 +3064,9 @@ class Client
3062
3064
  esc = Rack::Utils.escape_html(pm)
3063
3065
  FormEntryPermEach % [esc, perms_cnt, esc]
3064
3066
  end
3065
- perms = perms_list.join(''.freeze)
3067
+ perms = perms_list.join('')
3066
3068
  else
3067
- perms = ''.freeze
3069
+ perms = ''
3068
3070
  end
3069
3071
 
3070
3072
  return FormEntry % [
@@ -3208,7 +3210,7 @@ class Client
3208
3210
  <input type="hidden" name="ent-perm-cnt" id="ent-perm-cnt" value="%d">
3209
3211
  <div class="perms-list" id="ent-perm-list">%s
3210
3212
  </div>
3211
- </div>'.freeze
3213
+ </div>'
3212
3214
 
3213
3215
 
3214
3216
  # Entry form tag each
@@ -3217,7 +3219,7 @@ class Client
3217
3219
  <input class="form-tag" type="text" name="ent-tag-%d" value="%s">
3218
3220
  <button class="form-del" type="button" onclick="delDiv(this)">X
3219
3221
  </button>
3220
- </div>'.freeze
3222
+ </div>'
3221
3223
 
3222
3224
 
3223
3225
  # Entry form index each
@@ -3226,7 +3228,7 @@ class Client
3226
3228
  <input type="hidden" name="ent-idx-%d" value="%d">%s
3227
3229
  <button class="form-del" type="button" onclick="delDiv(this)">X
3228
3230
  </button>
3229
- </div>'.freeze
3231
+ </div>'
3230
3232
 
3231
3233
 
3232
3234
  # Entry form Perm each
@@ -3235,12 +3237,12 @@ class Client
3235
3237
  <input type="hidden" name="ent-perm-%d" value="%s">
3236
3238
  <button class="form-del" type="button" onclick="delDiv(this)">X
3237
3239
  </button>
3238
- </div>'.freeze
3240
+ </div>'
3239
3241
 
3240
3242
 
3241
3243
  # Entry form Perm option
3242
3244
  FormEntryPermOpt = '
3243
- <option value="%s">%s</option>'.freeze
3245
+ <option value="%s">%s</option>'
3244
3246
 
3245
3247
 
3246
3248
  # Entry form file each
@@ -3252,18 +3254,18 @@ class Client
3252
3254
  <input type="hidden" name="ent-file-%d-num" value="%d-%d">
3253
3255
  <button class="form-del" type="button" onclick="delDiv(this)">X
3254
3256
  </button>
3255
- </div>'.freeze
3257
+ </div>'
3256
3258
 
3257
3259
 
3258
3260
  # Entry form Stat option
3259
3261
  FormEntryStatOpt = '
3260
- <option value="%s">%s</option>'.freeze
3262
+ <option value="%s">%s</option>'
3261
3263
 
3262
3264
 
3263
3265
  # Entry form Stat select
3264
3266
  FormEntryStatSel = '
3265
3267
  <select class="stat-sel" id="ent-stat-sel" name="ent-stat-sel">%s
3266
- </select>'.freeze
3268
+ </select>'
3267
3269
 
3268
3270
 
3269
3271
  # Entry form Stat each
@@ -3279,7 +3281,7 @@ class Client
3279
3281
  <button class="add-claim" type="button"
3280
3282
  onClick="entAddClaim(this)">+
3281
3283
  </button>
3282
- </div>'.freeze
3284
+ </div>'
3283
3285
 
3284
3286
 
3285
3287
  # Entry form Stat Claim
@@ -3287,7 +3289,7 @@ class Client
3287
3289
  <div>
3288
3290
  <input class="form-usergrp" type="text" name="ent-stat-%d-%d"
3289
3291
  value="%s">
3290
- </div>'.freeze
3292
+ </div>'
3291
3293
 
3292
3294
 
3293
3295
  ###############################################
@@ -3300,7 +3302,7 @@ class Client
3300
3302
  if !act
3301
3303
  ta = [{
3302
3304
  'assigned' => ICFS::UserCase,
3303
- 'title' => ''.freeze,
3305
+ 'title' => '',
3304
3306
  'status' => true,
3305
3307
  'flag' => true,
3306
3308
  'time' => nil,
@@ -3314,7 +3316,7 @@ class Client
3314
3316
  al = api.access_list(cid)
3315
3317
  perm_act = al.include?(ICFS::PermAction)
3316
3318
  if !perm_act && !act
3317
- raise(Error::Perms, 'Missing perm: %s'.freeze % ICFS::PermAction)
3319
+ raise(Error::Perms, 'Missing perm: %s' % ICFS::PermAction)
3318
3320
  end
3319
3321
 
3320
3322
  # get user/group list
@@ -3324,13 +3326,13 @@ class Client
3324
3326
 
3325
3327
  # editing
3326
3328
  if opt[:edit]
3327
- ena_val = 'true'.freeze
3328
- ena_class_add = ''.freeze
3329
- ena_class_tasks = ''.freeze
3329
+ ena_val = 'true'
3330
+ ena_class_add = ''
3331
+ ena_class_tasks = ''
3330
3332
  else
3331
- ena_val = 'false'.freeze
3332
- ena_class_add = ' invisible'.freeze
3333
- ena_class_tasks = ' hidden'.freeze
3333
+ ena_val = 'false'
3334
+ ena_class_add = ' invisible'
3335
+ ena_class_tasks = ' hidden'
3334
3336
  end
3335
3337
 
3336
3338
  # each task
@@ -3355,18 +3357,18 @@ class Client
3355
3357
  title = FormActionTitleEd % [
3356
3358
  ix, Rack::Utils.escape_html(tk['title']) ]
3357
3359
  status = FormActionStatusEd % [
3358
- ix, tk['status'] ? ' checked'.freeze : ''.freeze ]
3360
+ ix, tk['status'] ? ' checked' : '' ]
3359
3361
  flag = FormActionFlagEd % [
3360
- ix, tk['flag'] ? ' checked'.freeze : ''.freeze ]
3362
+ ix, tk['flag'] ? ' checked' : '' ]
3361
3363
  if tk['time']
3362
3364
  time = FormActionTimeEd % [ ix, _util_time(env, tk['time']) ]
3363
3365
  else
3364
- time = FormActionTimeEd % [ix, ''.freeze]
3366
+ time = FormActionTimeEd % [ix, '']
3365
3367
  end
3366
3368
 
3367
3369
  if tk['tags'][0] == ICFS::TagNone
3368
3370
  tags_cnt = 1
3369
- tags = FormActionTagEd % [ix, 1, ''.freeze]
3371
+ tags = FormActionTagEd % [ix, 1, '']
3370
3372
  else
3371
3373
  tags_cnt = 0
3372
3374
  tags = tk['tags'].map do |tg|
@@ -3374,7 +3376,7 @@ class Client
3374
3376
  FormActionTagEd % [
3375
3377
  ix, tags_cnt, Rack::Utils.escape_html(tg) ]
3376
3378
  end
3377
- tags = tags.join(''.freeze)
3379
+ tags = tags.join('')
3378
3380
  end
3379
3381
 
3380
3382
  tag_list = 'act-%d-tag-list' % ix
@@ -3385,13 +3387,13 @@ class Client
3385
3387
  esc = Rack::Utils.escape_html(tk['title'])
3386
3388
  title = FormActionTitleRo % [ ix, esc, esc ]
3387
3389
  status = FormActionStatusRo % [ ix,
3388
- tk['status'] ? 'true'.freeze : 'false'.freeze,
3389
- tk['status'] ? 'Open'.freeze : 'Closed'.freeze,
3390
+ tk['status'] ? 'true' : 'false',
3391
+ tk['status'] ? 'Open' : 'Closed',
3390
3392
  ]
3391
3393
  if tk['flag']
3392
3394
  flag = FormActionFlagRo % ix
3393
3395
  else
3394
- flag = FormActionFlagEd % [ ix, ''.freeze ]
3396
+ flag = FormActionFlagEd % [ ix, '' ]
3395
3397
  end
3396
3398
  esc = _util_time(env, tk['time'])
3397
3399
  time = FormActionTimeRo % [ ix, esc, esc ]
@@ -3403,17 +3405,17 @@ class Client
3403
3405
  esc = Rack::Utils.escape_html(tg)
3404
3406
  FormActionTagRo % [ ix, tags_cnt, esc, esc ]
3405
3407
  end
3406
- tags = tags.join(''.freeze)
3408
+ tags = tags.join('')
3407
3409
  else
3408
- tags = ''.freeze
3410
+ tags = ''
3409
3411
  end
3410
3412
 
3411
- tag_add = ''.freeze
3413
+ tag_add = ''
3412
3414
 
3413
3415
  end
3414
3416
 
3415
3417
  tasks << FormActionTask % [
3416
- edit ? 'ed'.freeze : 'ro'.freeze,
3418
+ edit ? 'ed' : 'ro',
3417
3419
  ug, title, status, flag, time, ix, ix, tags_cnt, tags, tag_add
3418
3420
  ]
3419
3421
  end
@@ -3425,7 +3427,7 @@ class Client
3425
3427
  tasks.size,
3426
3428
  act ? act['action'] : 0,
3427
3429
  ena_class_tasks,
3428
- tasks.join(''.freeze)
3430
+ tasks.join('')
3429
3431
  ]
3430
3432
  end # def _form_action()
3431
3433
 
@@ -3456,7 +3458,7 @@ class Client
3456
3458
  </div>
3457
3459
  <div id="act-tasks" class="%s">%s
3458
3460
  </div>
3459
- </div>'.freeze
3461
+ </div>'
3460
3462
 
3461
3463
 
3462
3464
  # action task
@@ -3504,66 +3506,66 @@ class Client
3504
3506
  <input type="hidden" name="act-%d-tag" value="%d">%s
3505
3507
  </div>%s
3506
3508
  </div>
3507
- </div>'.freeze
3509
+ </div>'
3508
3510
 
3509
3511
 
3510
3512
  # action tasked editable
3511
3513
  FormActionTaskedEd = '
3512
3514
  <input class="form-usergrp" name="act-%d-task" type="text"
3513
- value="%s">'.freeze
3515
+ value="%s">'
3514
3516
 
3515
3517
 
3516
3518
  # action tasked read only
3517
3519
  FormActionTaskedRo = '
3518
3520
  <input name="act-%d-task" type="hidden" value="%s">
3519
- <div class="list-usergrp">%s</div>'.freeze
3521
+ <div class="list-usergrp">%s</div>'
3520
3522
 
3521
3523
 
3522
3524
  # action title editable
3523
3525
  FormActionTitleEd = '
3524
3526
  <input class="form-title" name="act-%d-title" type="text"
3525
- value="%s">'.freeze
3527
+ value="%s">'
3526
3528
 
3527
3529
 
3528
3530
  # action title read only
3529
3531
  FormActionTitleRo = '
3530
3532
  <input name="act-%d-title" type="hidden" value="%s">
3531
- <div class="list-title">%s</div>'.freeze
3533
+ <div class="list-title">%s</div>'
3532
3534
 
3533
3535
 
3534
3536
  # action open editable
3535
3537
  FormActionStatusEd = '
3536
3538
  <input class="form-check" name="act-%d-status" type="checkbox"
3537
- value="true"%s>'.freeze
3539
+ value="true"%s>'
3538
3540
 
3539
3541
  # action open readonly
3540
3542
  FormActionStatusRo = '
3541
3543
  <input name="act-%d-status" type="hidden" value="%s">
3542
- <div class="item-boolean">%s</div>'.freeze
3544
+ <div class="item-boolean">%s</div>'
3543
3545
 
3544
3546
 
3545
3547
  # action flag editable
3546
3548
  FormActionFlagEd = '
3547
3549
  <input class="form-check" name="act-%d-flag" type="checkbox"
3548
- value="true"%s>'.freeze
3550
+ value="true"%s>'
3549
3551
 
3550
3552
 
3551
3553
  # action flag read-only
3552
3554
  FormActionFlagRo = '
3553
3555
  <input name="act-%d-flag" type="hidden" value="true">
3554
- <div class="item-boolean">flagged</div>'.freeze
3556
+ <div class="item-boolean">flagged</div>'
3555
3557
 
3556
3558
 
3557
3559
  # action time editable
3558
3560
  FormActionTimeEd = '
3559
3561
  <input class="form-time" name="act-%d-time" type="text"
3560
- value="%s">'.freeze
3562
+ value="%s">'
3561
3563
 
3562
3564
 
3563
3565
  # action time read-only
3564
3566
  FormActionTimeRo = '
3565
3567
  <input name="act-%d-time" type="hidden" value="%s">
3566
- <div class="item-time">%s</div>'.freeze
3568
+ <div class="item-time">%s</div>'
3567
3569
 
3568
3570
 
3569
3571
  # action tag editable
@@ -3572,20 +3574,20 @@ class Client
3572
3574
  <input class="form-tag" type="text" name="act-%d-tag-%d"
3573
3575
  value="%s"><button class="form-del" type="button"
3574
3576
  onclick="delDiv(this)">X</button>
3575
- </div>'.freeze
3577
+ </div>'
3576
3578
 
3577
3579
 
3578
3580
  # action tag read-only
3579
3581
  FormActionTagRo = '
3580
3582
  <div>
3581
3583
  <input type="hidden" name="act-%d-tag-%d" value="%s">%s
3582
- </div>'.freeze
3584
+ </div>'
3583
3585
 
3584
3586
 
3585
3587
  # action tag button
3586
3588
  FormActionTagButton = '
3587
3589
  <button class="tag-add" type="button"
3588
- onClick="addTag(&quot;%s&quot;)">+</button>'.freeze
3590
+ onClick="addTag(&quot;%s&quot;)">+</button>'
3589
3591
 
3590
3592
 
3591
3593
  ###############################################
@@ -3596,14 +3598,14 @@ class Client
3596
3598
  if idx && idx['title']
3597
3599
  title = Rack::Utils.escape_html(idx['title'])
3598
3600
  else
3599
- title = ''.freeze
3601
+ title = ''
3600
3602
  end
3601
3603
 
3602
3604
  # content
3603
3605
  if idx && idx['content']
3604
3606
  content = Rack::Utils.escape_html(idx['content'])
3605
3607
  else
3606
- content = ''.freeze
3608
+ content = ''
3607
3609
  end
3608
3610
 
3609
3611
  # tags
@@ -3613,9 +3615,9 @@ class Client
3613
3615
  tags_cnt += 1
3614
3616
  FormIndexTagEach % [tags_cnt, Rack::Utils.escape_html(tg)]
3615
3617
  end
3616
- tags = tags_list.join(''.freeze)
3618
+ tags = tags_list.join('')
3617
3619
  else
3618
- tags = ''.freeze
3620
+ tags = ''
3619
3621
  end
3620
3622
 
3621
3623
  return FormIndex % [
@@ -3669,22 +3671,21 @@ class Client
3669
3671
  <div class="tag-list" id="idx-tag-list">
3670
3672
  <input type="hidden" name="idx-tag" value="%d">%s
3671
3673
  </div>
3672
- </div> '.freeze
3674
+ </div> '
3673
3675
 
3674
3676
 
3675
3677
  # Index form tag
3676
3678
  FormIndexTagEach = '
3677
3679
  <div>
3678
3680
  <input class="form-tag" type="text" name="idx-tag-%d" value="%s">
3679
- </div>'.freeze
3681
+ </div>'
3680
3682
 
3681
3683
 
3682
3684
  ###############################################
3683
3685
  # Config Form
3684
3686
  #
3685
3687
  def _form_config(env)
3686
- cfg = env['icfs.config']
3687
- tz = cfg.get('tz')
3688
+ tz = env['icfs'].config.get('tz')
3688
3689
  return FormConfig % [tz]
3689
3690
  end # def _form_config()
3690
3691
 
@@ -3706,7 +3707,7 @@ class Client
3706
3707
  Timezone to display date/times, format as +/-HH:MM.
3707
3708
  </div></div>
3708
3709
  </div>
3709
- </div>'.freeze
3710
+ </div>'
3710
3711
 
3711
3712
 
3712
3713
  ###########################################################
@@ -3726,16 +3727,16 @@ class Client
3726
3727
  cse['title'] = para['cse-title']
3727
3728
 
3728
3729
  # status
3729
- cse['status'] = (para['cse-status'] == 'true'.freeze) ? true : false
3730
+ cse['status'] = (para['cse-status'] == 'true') ? true : false
3730
3731
 
3731
3732
  # tags
3732
3733
  tags = []
3733
3734
  tcnt = para['cse-tag'].to_i
3734
3735
  if tcnt > 100
3735
- raise(Error::Interface, 'Tag count too large'.freeze)
3736
+ raise(Error::Interface, 'Tag count too large')
3736
3737
  end
3737
3738
  tcnt.times do |ix|
3738
- tx = 'cse-tag-%d'.freeze % [ix + 1]
3739
+ tx = 'cse-tag-%d' % [ix + 1]
3739
3740
  tag = para[tx]
3740
3741
  next if !tag || tag.empty?
3741
3742
  tags << tag
@@ -3750,21 +3751,21 @@ class Client
3750
3751
  acc = []
3751
3752
  acnt = para['cse-acc-cnt'].to_i
3752
3753
  if acnt > 100
3753
- raise(Error::Interface, 'Access count too large'.freeze)
3754
+ raise(Error::Interface, 'Access count too large')
3754
3755
  end
3755
3756
  acnt.times do |ix|
3756
3757
  ixr = ix + 1
3757
3758
 
3758
- pnam = para['cse-acc-%d-perm'.freeze % ixr]
3759
- gcnt = para['cse-acc-%d'.freeze % ixr].to_i
3759
+ pnam = para['cse-acc-%d-perm' % ixr]
3760
+ gcnt = para['cse-acc-%d' % ixr].to_i
3760
3761
  next if gcnt == 0 || !pnam || pnam.empty?
3761
3762
 
3762
3763
  grant = []
3763
3764
  if gcnt > 100
3764
- raise(Error::Interface, 'Grant count too large'.freeze)
3765
+ raise(Error::Interface, 'Grant count too large')
3765
3766
  end
3766
3767
  gcnt.times do |gx|
3767
- sug = para['cse-acc-%d-%d'.freeze % [ixr, gx+1]]
3768
+ sug = para['cse-acc-%d-%d' % [ixr, gx+1]]
3768
3769
  next if !sug || sug.empty?
3769
3770
  grant << sug
3770
3771
  end
@@ -3824,9 +3825,9 @@ class Client
3824
3825
  # tags
3825
3826
  tags = []
3826
3827
  tcnt = para['ent-tag'].to_i
3827
- raise(Error::Interface, 'too many tags'.freeze) if(tcnt > 100)
3828
+ raise(Error::Interface, 'too many tags') if(tcnt > 100)
3828
3829
  tcnt.times do |ix|
3829
- tx = 'ent-tag-%d'.freeze % [ix + 1]
3830
+ tx = 'ent-tag-%d' % [ix + 1]
3830
3831
  tag = para[tx]
3831
3832
  tags << tag unless( !tag || tag.empty? )
3832
3833
  end
@@ -3835,9 +3836,9 @@ class Client
3835
3836
  # indexes
3836
3837
  index = []
3837
3838
  icnt = para['ent-idx-cnt'].to_i
3838
- raise(Error::Interface, 'Too many indexes'.freeze) if(icnt > 100)
3839
+ raise(Error::Interface, 'Too many indexes') if(icnt > 100)
3839
3840
  icnt.times do |ix|
3840
- tx = 'ent-idx-%d'.freeze % (ix + 1)
3841
+ tx = 'ent-idx-%d' % (ix + 1)
3841
3842
  xnum = para[tx].to_i
3842
3843
  index << xnum unless xnum == 0
3843
3844
  end
@@ -3846,9 +3847,9 @@ class Client
3846
3847
  # perms
3847
3848
  perms = []
3848
3849
  pcnt = para['ent-perm-cnt'].to_i
3849
- raise(Error::Interface, 'Too many perms'.freeze) if(pcnt > 100)
3850
+ raise(Error::Interface, 'Too many perms') if(pcnt > 100)
3850
3851
  pcnt.times do |ix|
3851
- px = 'ent-perm-%d'.freeze % [ix + 1]
3852
+ px = 'ent-perm-%d' % [ix + 1]
3852
3853
  pm = para[px]
3853
3854
  next if !pm || pm.empty?
3854
3855
  perms << pm
@@ -3858,20 +3859,20 @@ class Client
3858
3859
  # stats
3859
3860
  stats = []
3860
3861
  scnt = para['ent-stats-cnt'].to_i
3861
- raise(Error::Interface, 'Too many stats'.freeze) if(scnt > 100)
3862
+ raise(Error::Interface, 'Too many stats') if(scnt > 100)
3862
3863
  scnt.times do |ix|
3863
3864
  ixr = ix + 1
3864
- sname = para['ent-stat-%d-name'.freeze % ixr]
3865
- sval = para['ent-stat-%d-value'.freeze % ixr]
3865
+ sname = para['ent-stat-%d-name' % ixr]
3866
+ sval = para['ent-stat-%d-value' % ixr]
3866
3867
  next if !sname || !sval || sname.empty? || sval.empty?
3867
3868
 
3868
3869
  sval = sval.to_f
3869
3870
 
3870
- scred = para['ent-stat-%d'.freeze % ixr].to_i
3871
+ scred = para['ent-stat-%d' % ixr].to_i
3871
3872
  sugs = []
3872
- raise(Error::Interface, 'Too many credits'.freeze) if(scred > 100)
3873
+ raise(Error::Interface, 'Too many credits') if(scred > 100)
3873
3874
  scred.times do |cx|
3874
- sug = para['ent-stat-%d-%d'.freeze % [ixr, cx + 1]]
3875
+ sug = para['ent-stat-%d-%d' % [ixr, cx + 1]]
3875
3876
  next if !sug || sug.empty?
3876
3877
  sugs << sug
3877
3878
  end
@@ -3888,7 +3889,7 @@ class Client
3888
3889
  # files
3889
3890
  files = []
3890
3891
  fcnt = para['ent-file-cnt'].to_i
3891
- raise(Error::Interface, 'Too many files'.freeze) if(fcnt > 100)
3892
+ raise(Error::Interface, 'Too many files') if(fcnt > 100)
3892
3893
  fcnt.times do |ix|
3893
3894
  ixr = ix + 1
3894
3895
  fnam = para['ent-file-%d-name' % ixr]
@@ -3896,7 +3897,7 @@ class Client
3896
3897
  fnum = para['ent-file-%d-num' % ixr]
3897
3898
 
3898
3899
  if fnum
3899
- fnum, flog = fnum.split('-'.freeze).map do |xx|
3900
+ fnum, flog = fnum.split('-').map do |xx|
3900
3901
  y = xx.to_i
3901
3902
  (y == 0) ? nil : y
3902
3903
  end
@@ -3941,28 +3942,28 @@ class Client
3941
3942
  act['action'] = anum if anum != 0
3942
3943
 
3943
3944
  # any edit?
3944
- return anum unless para['act-ena'] == 'true'.freeze
3945
+ return anum unless para['act-ena'] == 'true'
3945
3946
 
3946
3947
  # tasks
3947
3948
  tasks = []
3948
3949
  acnt = para['act-cnt'].to_i
3949
- raise(Error::Interface, 'Too many tasks'.freeze) if(acnt > 100)
3950
+ raise(Error::Interface, 'Too many tasks') if(acnt > 100)
3950
3951
  acnt.times do |ix|
3951
- tx = 'act-%d'.freeze % [ix + 1]
3952
+ tx = 'act-%d' % [ix + 1]
3952
3953
 
3953
- ug = para[tx + '-task'.freeze]
3954
- title = para[tx + '-title'.freeze]
3955
- status = (para[tx + '-status'] == 'true'.freeze) ? true : false
3956
- flag = (para[tx + '-flag'] == 'true'.freeze) ? true : false
3954
+ ug = para[tx + '-task']
3955
+ title = para[tx + '-title']
3956
+ status = (para[tx + '-status'] == 'true') ? true : false
3957
+ flag = (para[tx + '-flag'] == 'true') ? true : false
3957
3958
 
3958
3959
  tstr = para[tx + '-time']
3959
3960
  time = _util_time_parse(env, tstr)
3960
3961
 
3961
3962
  tags = []
3962
- tcnt = para[tx + '-tag'.freeze].to_i
3963
- raise(Error::Interface, 'Too many tags'.freeze) if (tcnt > 100)
3963
+ tcnt = para[tx + '-tag'].to_i
3964
+ raise(Error::Interface, 'Too many tags') if (tcnt > 100)
3964
3965
  tcnt.times do |gx|
3965
- tag = para[tx + '-tag-%d'.freeze % [gx + 1]]
3966
+ tag = para[tx + '-tag-%d' % [gx + 1]]
3966
3967
  next if !tag || tag.empty?
3967
3968
  tags << tag
3968
3969
  end
@@ -4007,9 +4008,9 @@ class Client
4007
4008
  # tags
4008
4009
  tags = []
4009
4010
  tcnt = para['idx-tag'].to_i
4010
- raise(Error::Interface, 'Too many tags'.freeze) if(tcnt > 100)
4011
+ raise(Error::Interface, 'Too many tags') if(tcnt > 100)
4011
4012
  tcnt.times do |ix|
4012
- tx = 'idx-tag-%d'.freeze % [ix + 1]
4013
+ tx = 'idx-tag-%d' % [ix + 1]
4013
4014
  tag = para[tx]
4014
4015
  tags << tag unless( !tag | tag.empty? )
4015
4016
  end
@@ -4038,7 +4039,7 @@ class Client
4038
4039
  # Link to info page
4039
4040
  #
4040
4041
  def _a_info(env, txt)
4041
- '<a href="%s/info">%s</a>'.freeze % [
4042
+ '<a href="%s/info">%s</a>' % [
4042
4043
  env['SCRIPT_NAME'],
4043
4044
  Rack::Utils.escape_html(txt)
4044
4045
  ]
@@ -4048,7 +4049,7 @@ class Client
4048
4049
  ###############################################
4049
4050
  # Link to Case search
4050
4051
  def _a_case_search(env, query, txt)
4051
- '<a href="%s/case_search%s">%s</a>'.freeze % [
4052
+ '<a href="%s/case_search%s">%s</a>' % [
4052
4053
  env['SCRIPT_NAME'],
4053
4054
  _util_query(query),
4054
4055
  Rack::Utils.escape_html(txt)
@@ -4060,7 +4061,7 @@ class Client
4060
4061
  # Link to Entry search
4061
4062
  #
4062
4063
  def _a_entry_search(env, query, txt)
4063
- '<a href="%s/entry_search%s">%s</a>'.freeze % [
4064
+ '<a href="%s/entry_search%s">%s</a>' % [
4064
4065
  env['SCRIPT_NAME'],
4065
4066
  _util_query(query),
4066
4067
  Rack::Utils.escape_html(txt)
@@ -4072,7 +4073,7 @@ class Client
4072
4073
  # Link to Log search
4073
4074
  #
4074
4075
  def _a_log_search(env, query, txt)
4075
- '<a href="%s/log_search%s">%s</a>'.freeze % [
4076
+ '<a href="%s/log_search%s">%s</a>' % [
4076
4077
  env['SCRIPT_NAME'],
4077
4078
  _util_query(query),
4078
4079
  Rack::Utils.escape_html(txt)
@@ -4084,7 +4085,7 @@ class Client
4084
4085
  # Link to Action search
4085
4086
  #
4086
4087
  def _a_action_search(env, query, txt)
4087
- '<a href="%s/action_search%s">%s</a>'.freeze % [
4088
+ '<a href="%s/action_search%s">%s</a>' % [
4088
4089
  env['SCRIPT_NAME'],
4089
4090
  _util_query(query),
4090
4091
  Rack::Utils.escape_html(txt)
@@ -4096,7 +4097,7 @@ class Client
4096
4097
  # Link to Index search
4097
4098
  #
4098
4099
  def _a_index_search(env, query, txt)
4099
- '<a href="%s/index_search%s">%s</a>'.freeze % [
4100
+ '<a href="%s/index_search%s">%s</a>' % [
4100
4101
  env['SCRIPT_NAME'],
4101
4102
  _util_query(query),
4102
4103
  Rack::Utils.escape_html(txt)
@@ -4108,7 +4109,7 @@ class Client
4108
4109
  # Link to stats search
4109
4110
  #
4110
4111
  def _a_stats(env, query, txt)
4111
- '<a href="%s/stats%s">%s</a>'.freeze % [
4112
+ '<a href="%s/stats%s">%s</a>' % [
4112
4113
  env['SCRIPT_NAME'],
4113
4114
  _util_query(query),
4114
4115
  Rack::Utils.escape_html(txt)
@@ -4119,7 +4120,7 @@ class Client
4119
4120
  ###############################################
4120
4121
  # Link to case tags
4121
4122
  def _a_case_tags(env, query, txt)
4122
- '<a href="%s/case_tags%s">%s</a>'.freeze % [
4123
+ '<a href="%s/case_tags%s">%s</a>' % [
4123
4124
  env['SCRIPT_NAME'],
4124
4125
  _util_query(query),
4125
4126
  Rack::Utils.escape_html(txt)
@@ -4131,7 +4132,7 @@ class Client
4131
4132
  # Link to entry tags
4132
4133
  #
4133
4134
  def _a_entry_tags(env, query, txt)
4134
- '<a href="%s/entry_tags/%s">%s</a>'.freeze % [
4135
+ '<a href="%s/entry_tags/%s">%s</a>' % [
4135
4136
  env['SCRIPT_NAME'],
4136
4137
  _util_query(query),
4137
4138
  Rack::Utils.escape_html(txt),
@@ -4142,7 +4143,7 @@ class Client
4142
4143
  ###############################################
4143
4144
  # Link to action tags
4144
4145
  def _a_action_tags(env, query, txt)
4145
- '<a href="%s/action_tags%s">%s</a>'.freeze % [
4146
+ '<a href="%s/action_tags%s">%s</a>' % [
4146
4147
  env['SCRIPT_NAME'],
4147
4148
  _util_query(query),
4148
4149
  Rack::Utils.escape_html(txt)
@@ -4153,7 +4154,7 @@ class Client
4153
4154
  ###############################################
4154
4155
  # Link to action tags
4155
4156
  def _a_index_tags(env, query, txt)
4156
- '<a href="%s/index_tags/%s">%s</a>'.freeze % [
4157
+ '<a href="%s/index_tags/%s">%s</a>' % [
4157
4158
  env['SCRIPT_NAME'],
4158
4159
  _util_query(query),
4159
4160
  Rack::Utils.escape_html(txt)
@@ -4165,7 +4166,7 @@ class Client
4165
4166
  # Link to create a case
4166
4167
  #
4167
4168
  def _a_case_create(env, tid, txt)
4168
- '<a href="%s/case_create/%s">%s</a>'.freeze % [
4169
+ '<a href="%s/case_create/%s">%s</a>' % [
4169
4170
  env['SCRIPT_NAME'],
4170
4171
  Rack::Utils.escape(tid),
4171
4172
  Rack::Utils.escape_html(txt),
@@ -4177,7 +4178,7 @@ class Client
4177
4178
  # Link to Case edit
4178
4179
  #
4179
4180
  def _a_case_edit(env, cid, txt)
4180
- '<a href="%s/case_edit/%s">%s</a>'.freeze % [
4181
+ '<a href="%s/case_edit/%s">%s</a>' % [
4181
4182
  env['SCRIPT_NAME'],
4182
4183
  Rack::Utils.escape(cid),
4183
4184
  Rack::Utils.escape_html(txt)
@@ -4189,7 +4190,7 @@ class Client
4189
4190
  # Link to Entry edit
4190
4191
  #
4191
4192
  def _a_entry_edit(env, cid, enum, anum, txt)
4192
- '<a href="%s/entry_edit/%s/%d/%d">%s</a>'.freeze % [
4193
+ '<a href="%s/entry_edit/%s/%d/%d">%s</a>' % [
4193
4194
  env['SCRIPT_NAME'],
4194
4195
  Rack::Utils.escape(cid),
4195
4196
  enum, anum,
@@ -4202,7 +4203,7 @@ class Client
4202
4203
  # Link to Index edit
4203
4204
  #
4204
4205
  def _a_index_edit(env, cid, xnum, txt)
4205
- '<a href="%s/index_edit/%s/%d">%s</a>'.freeze % [
4206
+ '<a href="%s/index_edit/%s/%d">%s</a>' % [
4206
4207
  env['SCRIPT_NAME'],
4207
4208
  Rack::Utils.escape(cid),
4208
4209
  xnum,
@@ -4215,7 +4216,7 @@ class Client
4215
4216
  # Link to Config edit
4216
4217
  #
4217
4218
  def _a_config_edit(env, txt)
4218
- '<a href="%s/config_edit">%s</a>'.freeze % [
4219
+ '<a href="%s/config_edit">%s</a>' % [
4219
4220
  env['SCRIPT_NAME'],
4220
4221
  Rack::Utils.escape_html(txt)
4221
4222
  ]
@@ -4226,7 +4227,7 @@ class Client
4226
4227
  # Link to Home
4227
4228
  #
4228
4229
  def _a_home(env, txt)
4229
- '<a href="%s/home">%s</a>'.freeze % [
4230
+ '<a href="%s/home">%s</a>' % [
4230
4231
  env['SCRIPT_NAME'],
4231
4232
  Rack::Utils.escape_html(txt)
4232
4233
  ]
@@ -4237,7 +4238,7 @@ class Client
4237
4238
  # Link to Case
4238
4239
  #
4239
4240
  def _a_case(env, cid, lnum, txt)
4240
- '<a href="%s/case/%s/%d">%s</a>'.freeze % [
4241
+ '<a href="%s/case/%s/%d">%s</a>' % [
4241
4242
  env['SCRIPT_NAME'],
4242
4243
  Rack::Utils.escape(cid),
4243
4244
  lnum,
@@ -4249,7 +4250,7 @@ class Client
4249
4250
  ###############################################
4250
4251
  # Link to an entry
4251
4252
  def _a_entry(env, cid, enum, lnum, txt)
4252
- '<a href="%s/entry/%s/%d/%d">%s</a>'.freeze % [
4253
+ '<a href="%s/entry/%s/%d/%d">%s</a>' % [
4253
4254
  env['SCRIPT_NAME'],
4254
4255
  Rack::Utils.escape(cid),
4255
4256
  enum,
@@ -4263,7 +4264,7 @@ class Client
4263
4264
  # Link to a Log
4264
4265
  #
4265
4266
  def _a_log(env, cid, lnum, txt)
4266
- '<a href="%s/log/%s/%d">%s</a>'.freeze % [
4267
+ '<a href="%s/log/%s/%d">%s</a>' % [
4267
4268
  env['SCRIPT_NAME'],
4268
4269
  Rack::Utils.escape(cid),
4269
4270
  lnum,
@@ -4276,7 +4277,7 @@ class Client
4276
4277
  # Link to an Action
4277
4278
  #
4278
4279
  def _a_action(env, cid, anum, lnum, txt)
4279
- '<a href="%s/action/%s/%d/%d">%s</a>'.freeze % [
4280
+ '<a href="%s/action/%s/%d/%d">%s</a>' % [
4280
4281
  env['SCRIPT_NAME'],
4281
4282
  Rack::Utils.escape(cid),
4282
4283
  anum,
@@ -4290,7 +4291,7 @@ class Client
4290
4291
  # Link to an Index
4291
4292
  #
4292
4293
  def _a_index(env, cid, xnum, lnum, txt)
4293
- '<a href="%s/index/%s/%d/%d">%s</a>'.freeze % [
4294
+ '<a href="%s/index/%s/%d/%d">%s</a>' % [
4294
4295
  env['SCRIPT_NAME'],
4295
4296
  Rack::Utils.escape(cid),
4296
4297
  xnum,
@@ -4304,7 +4305,7 @@ class Client
4304
4305
  # Link to a File
4305
4306
  #
4306
4307
  def _a_file(env, cid, enum, lnum, fnum, fname, txt)
4307
- '<a href="%s/file/%s/%d-%d-%d-%s">%s</a>'.freeze % [
4308
+ '<a href="%s/file/%s/%d-%d-%d-%s">%s</a>' % [
4308
4309
  env['SCRIPT_NAME'],
4309
4310
  Rack::Utils.escape(cid),
4310
4311
  enum, lnum, fnum, Rack::Utils.escape(fname),
@@ -4322,8 +4323,8 @@ class Client
4322
4323
  # Require a GET HTTP method
4323
4324
  #
4324
4325
  def _verb_get(env)
4325
- if env['REQUEST_METHOD'] != 'GET'.freeze
4326
- raise(Error::Interface, 'Only GET method allowed'.freeze)
4326
+ if env['REQUEST_METHOD'] != 'GET'
4327
+ raise(Error::Interface, 'Only GET method allowed')
4327
4328
  end
4328
4329
  end # def _verb_get()
4329
4330
 
@@ -4332,9 +4333,9 @@ class Client
4332
4333
  # Require a GET or POST method
4333
4334
  #
4334
4335
  def _verb_getpost(env)
4335
- if env['REQUEST_METHOD'] != 'GET'.freeze &&
4336
- env['REQUEST_METHOD'] != 'POST'.freeze
4337
- raise(Error::Interface, 'Only GET or POST method allowed'.freeze)
4336
+ if env['REQUEST_METHOD'] != 'GET' &&
4337
+ env['REQUEST_METHOD'] != 'POST'
4338
+ raise(Error::Interface, 'Only GET or POST method allowed')
4338
4339
  end
4339
4340
  end # def _verb_getpost()
4340
4341
 
@@ -4346,7 +4347,7 @@ class Client
4346
4347
  rck = Rack::Request.new(env)
4347
4348
  para = rck.POST
4348
4349
  para.each do |key, val|
4349
- val.force_encoding('utf-8'.freeze) if val.is_a?(String)
4350
+ val.force_encoding('utf-8') if val.is_a?(String)
4350
4351
  end
4351
4352
  return para
4352
4353
  end # def _util_post()
@@ -4358,10 +4359,10 @@ class Client
4358
4359
  def _util_case(env)
4359
4360
  cmps = env['icfs.cmps']
4360
4361
  if cmps.size < 2 || cmps[1].empty?
4361
- raise(Error::NotFound, 'No case specified in the URL'.freeze)
4362
+ raise(Error::NotFound, 'No case specified in the URL')
4362
4363
  end
4363
4364
  cid = Rack::Utils.unescape(cmps[1])
4364
- Items.validate(cid, 'case'.freeze, Items::FieldCaseid)
4365
+ Items.validate(cid, 'case', Items::FieldCaseid)
4365
4366
  env['icfs.cid'] = cid
4366
4367
  return cid
4367
4368
  end # def _util_case()
@@ -4380,8 +4381,8 @@ class Client
4380
4381
  # Epoch time as local
4381
4382
  #
4382
4383
  def _util_time(env, time)
4383
- tz = env['icfs.config'].get('tz')
4384
- Time.at(time).getlocal(tz).strftime('%F %T'.freeze)
4384
+ tz = env['icfs'].config.get('tz')
4385
+ Time.at(time).getlocal(tz).strftime('%F %T')
4385
4386
  end
4386
4387
 
4387
4388
 
@@ -4389,19 +4390,10 @@ class Client
4389
4390
  # Parse a provided time string
4390
4391
  #
4391
4392
  def _util_time_parse(env, str)
4392
- return nil if !str || !str.is_a?(String)
4393
- val = str.strip
4394
- now = Time.now.to_i
4395
-
4396
- # empty string defaults to now
4397
- return now if val.empty?
4398
-
4399
- # default use parse
4400
- ma = /[+-]\d{2}:\d{2}$/.match str
4401
- tstr = ma ? str : str + env['icfs.config'].get('tz')
4402
- time = Time.parse(tstr).to_i
4403
- rescue ArgumentError
4404
- return nil
4393
+ cfg = env['icfs'].config
4394
+ time = ICFS.time_parse(str, cfg)
4395
+ raise(Error::Value, 'Invalid time string') if !time
4396
+ return time
4405
4397
  end
4406
4398
 
4407
4399
 
@@ -4410,11 +4402,11 @@ class Client
4410
4402
  def _util_query(query)
4411
4403
  if query
4412
4404
  qa = query.map do |key, val|
4413
- '%s=%s'.freeze % [Rack::Utils.escape(key), Rack::Utils.escape(val)]
4405
+ '%s=%s' % [Rack::Utils.escape(key), Rack::Utils.escape(val)]
4414
4406
  end
4415
- return '?'.freeze + qa.join('&amp;'.freeze)
4407
+ return '?' + qa.join('&amp;')
4416
4408
  else
4417
- return ''.freeze
4409
+ return ''
4418
4410
  end
4419
4411
  end # def _util_query()
4420
4412
 
@@ -4435,7 +4427,7 @@ class Client
4435
4427
  when :string
4436
4428
  query[sym] = val
4437
4429
  when :array
4438
- query[sym] = val.split(','.freeze).map{|aa| aa.strip}
4430
+ query[sym] = val.split(',').map{|aa| aa.strip}
4439
4431
  when :boolean
4440
4432
  if val == 'true'
4441
4433
  query[sym] = true
@@ -4479,7 +4471,7 @@ class Client
4479
4471
  body
4480
4472
  ]
4481
4473
  head = {
4482
- 'Content-Type' => 'text/html; charset=utf-8'.freeze,
4474
+ 'Content-Type' => 'text/html; charset=utf-8',
4483
4475
  'Content-Length' => html.bytesize.to_s
4484
4476
  }
4485
4477
  return [res, head, [html]]
@@ -4497,7 +4489,7 @@ class Client
4497
4489
  <body>%s
4498
4490
  </body>
4499
4491
  </html>
4500
- '.freeze
4492
+ '
4501
4493
 
4502
4494
 
4503
4495
  ###############################################