Skip to content

Commit b325291

Browse files
committed
Merge branch 'main' of https://github.com/intersystems/git-source-control into map-expand-env
2 parents 1e39855 + ebf933e commit b325291

File tree

6 files changed

+164
-14
lines changed

6 files changed

+164
-14
lines changed

CHANGELOG.md

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
1010
### Added
1111
- Production Decomposition mode allows controlling interoperability productions as individual files for each host (#469)
1212
- Mapping configuration supports parameter expansion of \<env\> to the environment name (#640)
13+
- Added saving settings as system default for new namespaces (#535)
14+
- Added filtering through branch names in UI (#615)
1315

1416
## [2.7.1] - 2024-11-13
1517

cls/SourceControl/Git/Settings.cls

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -243,6 +243,7 @@ ClassMethod CreateNamespaceTempFolder() As %Status
243243
ClassMethod Configure() As %Boolean [ CodeMode = objectgenerator ]
244244
{
245245
do %code.WriteLine(" set inst = ..%New()")
246+
do %code.WriteLine(" do inst.RetrieveDefaults()")
246247
set defaultPromptFlag = $$$DisableBackupCharMask + $$$TrapCtrlCMask + $$$EnableQuitCharMask + $$$DisableHelpCharMask + $$$DisableHelpContextCharMask + $$$TrapErrorMask
247248
set property = ""
248249
for {
@@ -483,4 +484,25 @@ Method ConfigureBinPath(ByRef path As %String) As %Boolean
483484
return 1
484485
}
485486

487+
Method RetrieveDefaults() As %Boolean
488+
{
489+
do ##class(%zpkg.isc.sc.git.Defaults).GetDefaultSettings(.settings)
490+
set iterator = settings.%GetIterator()
491+
while iterator.%GetNext(.key, .value) {
492+
set $property($this,key) = value
493+
}
494+
return $$$OK
495+
}
496+
497+
Method SaveDefaults() As %Boolean
498+
{
499+
set defaults = {}
500+
set items = $lb("gitBinPath", "pullEventClass", "percentClassReplace", "environmentName", "systemBasicMode", "defaultMergeBranch", "mappedItemsReadOnly", "compileOnImport")
501+
for i=1:1:$LISTLENGTH(items) {
502+
set property = $listget(items,i)
503+
do defaults.%Set(property, $property($this, property))
504+
}
505+
return ##class(%zpkg.isc.sc.git.Defaults).SetDefaultSettings(defaults)
506+
}
507+
486508
}

cls/_zpkg/isc/sc/git/Defaults.cls

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,62 @@
1+
Class %zpkg.isc.sc.git.Defaults
2+
{
3+
4+
ClassMethod GetDefaults() As %Library.DynamicObject [ NotInheritable, Private ]
5+
{
6+
set defaults = {}
7+
set storage = "^%SYS(""SourceControl"",""Git"",""defaults"")"
8+
$$$AddAllRoleTemporary
9+
10+
set key = $order(@storage@(""))
11+
while key '= "" {
12+
do defaults.%Set(key, $get(@storage@(key)))
13+
set key = $order(@storage@(key))
14+
}
15+
return defaults
16+
}
17+
18+
ClassMethod GetDefaultSettings(ByRef defaults As %Library.DynamicObject) As %Status
19+
{
20+
try {
21+
set defaults = ..GetDefaults()
22+
} catch e {
23+
return e.AsStatus()
24+
}
25+
return $$$OK
26+
}
27+
28+
ClassMethod SetDefaults(defaults As %Library.DynamicObject) As %Status [ NotInheritable, Private ]
29+
{
30+
31+
$$$AddAllRoleTemporary
32+
set storage = "^%SYS(""SourceControl"",""Git"",""defaults"")"
33+
k @storage
34+
set iterator = defaults.%GetIterator()
35+
36+
while iterator.%GetNext(.key, .value) {
37+
set @storage@(key) = value
38+
}
39+
40+
return $$$OK
41+
}
42+
43+
ClassMethod SetDefaultSettings(defaults As %Library.DynamicObject) As %Status [ NotInheritable ]
44+
{
45+
46+
set newDefaults = {}
47+
48+
set iterator = defaults.%GetIterator()
49+
50+
while iterator.%GetNext(.key, .value) {
51+
do newDefaults.%Set(key, value)
52+
}
53+
54+
try {
55+
do ..SetDefaults(newDefaults)
56+
} catch e {
57+
return e.AsStatus()
58+
}
59+
return $$$OK
60+
}
61+
62+
}

csp/gitprojectsettings.csp

Lines changed: 32 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -165,6 +165,10 @@ body {
165165
}
166166

167167
set settings.favoriteNamespaces = contexts
168+
169+
if ($get(%request.Data("proxySubmitButton",1)) = "saveDefaults") {
170+
do settings.SaveDefaults()
171+
}
168172
}
169173
set err = ""
170174
try {
@@ -226,7 +230,7 @@ body {
226230

227231
<fieldset id="namespaceSettings">
228232
<div class="form-group row mb-3">
229-
<label for="gitBinPath" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Absolute path to the Git executable">Path to git.exe</label>
233+
<label for="gitBinPath" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Absolute path to the Git executable"><b>Path to git.exe</b></label>
230234
<div class="col-sm-7">
231235
<server>
232236
set exists = ##class(SourceControl.Git.Utils).GitBinExists(.version)
@@ -345,7 +349,7 @@ body {
345349
</server>
346350

347351
<div class="form-group row mb-3">
348-
<label for="pullEventClass" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Handler class for git pull">Pull Event Class</label>
352+
<label for="pullEventClass" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Handler class for git pull"><b>Pull Event Class</b></label>
349353
<div class="col-sm-7">
350354
<select class="form-control" id="pullEventClass" name="pullEventClass">
351355
<server>
@@ -361,7 +365,7 @@ body {
361365
</div>
362366

363367
<div class="form-group row mb-3">
364-
<label for="environmentName" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Environment Name">Environment Name</label>
368+
<label for="environmentName" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Environment Name"><b>Environment Name</b></label>
365369
<div class="col-sm-7">
366370
<select class="form-control" id="environmentName" name="environmentName">
367371
<server>
@@ -375,14 +379,14 @@ body {
375379
</div>
376380

377381
<div class="form-group row mb-3">
378-
<label for="percentClassReplace" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Character(s) to replace '%' with for percent classes while exporting them out to the filesystem. By default, the '%' is removed.">'%' Replacement on Export</label>
382+
<label for="percentClassReplace" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Character(s) to replace '%' with for percent classes while exporting them out to the filesystem. By default, the '%' is removed."><b>'%' Replacement on Export</b></label>
379383
<div class="col-sm-7">
380384
<input type="text" class="form-control" id="percentClassReplace" name="percentClassReplace" value='#(..EscapeHTML(settings.percentClassReplace))#' placeholder="_, __, <empty>, etc."/>
381385
</div>
382386
</div>
383387

384388
<div class="form-group row mb-3">
385-
<label for="systemBasicMode" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Enable basic mode for all users, which reduces the number of menu options and requires less knowledge of git. This is suitable for a single-developer (non-shared) namespace."> Basic Mode as System Default</label>
389+
<label for="systemBasicMode" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Enable basic mode for all users, which reduces the number of menu options and requires less knowledge of git. This is suitable for a single-developer (non-shared) namespace."><b> Basic Mode as System Default</b></label>
386390
<div class="col-sm-7">
387391

388392
<div class="custom-control custom-switch custom-switch-no-border">
@@ -403,14 +407,14 @@ body {
403407
</div>
404408

405409
<div class="form-group row mb-3">
406-
<label for="defaultMergeBranch" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="In basic mode, the Sync operation will merge changes from this remote branch (leave blank for no branch)">Default merge branch</label>
410+
<label for="defaultMergeBranch" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="In basic mode, the Sync operation will merge changes from this remote branch (leave blank for no branch)"><b>Default merge branch</b></label>
407411
<div class="col-sm-7">
408412
<input type="text" class="form-control" id="defaultMergeBranch" name="defaultMergeBranch" value='#(..EscapeHTML(settings.defaultMergeBranch))#' placeholder="sample-remote-branch">
409413
</div>
410414
</div>
411415

412416
<div class="form-group row mb-3">
413-
<label for="remoteRepo" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Url to Remote repository">Remote Repository</label>
417+
<label for="remoteRepo" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Url to Remote repository"><b>Remote Repository</b></label>
414418
<div class="col-sm-7">
415419
<input type="text" class="form-control" id="remoteRepo" name="remoteRepo" value='#(..EscapeHTML(remote))#' placeholder="ex. [email protected]:User/UserRepo.git"/>
416420
<div class = "neutral-feedback">
@@ -420,7 +424,7 @@ body {
420424
</div>
421425

422426
<div class="form-group row mb-3">
423-
<label for="mappedItemsReadOnly" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Whether items mapped from a database other than this namespace's default routine database should be read-only. If enabled, mapped items won't be saved to source control or exported. NOTE: These are different from the mappings configured in this settings page"> Treat Mapped Items as Read-only</label>
427+
<label for="mappedItemsReadOnly" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Whether items mapped from a database other than this namespace's default routine database should be read-only. If enabled, mapped items won't be saved to source control or exported. NOTE: These are different from the mappings configured in this settings page"><b> Treat Mapped Items as Read-only</b></label>
424428
<div class="col-sm-7">
425429

426430
<div class="custom-control custom-switch custom-switch-no-border">
@@ -440,7 +444,7 @@ body {
440444

441445
</div>
442446
<div class="form-group row mb-3">
443-
<label for="compileOnImport" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="If true, the Import All options will compile imported options using the configured pull event handler">Compile Items on Import</label>
447+
<label for="compileOnImport" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="If true, the Import All options will compile imported options using the configured pull event handler"><b>Compile Items on Import</b></label>
444448
<div class="col-sm-7">
445449
<div class="custom-control custom-switch custom-switch-no-border">
446450
<input class="custom-control-input" name="compileOnImport" type="checkbox"
@@ -586,7 +590,7 @@ body {
586590
</div>
587591

588592
<div class="form-group row mb-3">
589-
<label for="gitUserEmail" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="<git-username-on-remote>@remote.com">Git Committer Email </label>
593+
<label for="gitUserEmail" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="<git-username-on-remote>@remote.com">Git Committer Email</label>
590594
<div class="col-sm-7">
591595
<input type="email" class="form-control" id="gitUserEmail" name="gitUserEmail" value='#(..EscapeHTML(settings.gitUserEmail))#'/>
592596
</div>
@@ -649,7 +653,7 @@ body {
649653
</div>
650654

651655
<div class="form-group row mb-3">
652-
<label for="addToFav" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Favorite namespaces for user to add link on Home page.">Favorite Namespaces</label>
656+
<label for="addToFav" class="offset-sm-1 col-sm-3 col-form-label" data-toggle="tooltip" data-placement="top" title="Favorite namespaces for user to add link on Home page.">*Favorite Namespaces</label>
653657
<div class="col-sm-7">
654658
<select multiple class="form-control" id="addToFav" name="favNamespace">
655659
<server>
@@ -674,7 +678,12 @@ body {
674678

675679
<div class="form-group row mb-3">
676680
<div class="col-sm-12 text-center">
677-
<input type='submit' class="btn-lg btn-primary" value = 'Save'/>
681+
<input type="hidden" id="proxySubmitButton" name="proxySubmitButton" value="Save">
682+
<input type='submit' class="btn-lg btn-primary" value = 'Save' name="Save"/>
683+
<input type="submit" class="btn-lg btn-primary" id="saveDefaults" value = 'Save as Instance Defaults' title="Save these settings as default for new instances" name="saveDefaults"/>
684+
<div>
685+
<small> Settings saved as default are <b>bolded </b> </small>
686+
</div>
678687
</div>
679688
</div>
680689

@@ -701,6 +710,17 @@ function getSocket(urlPostfix) {
701710
return new WebSocket(socketURL);
702711
}
703712

713+
var submitForm = function(e) {
714+
e.preventDefault();
715+
e.stopPropagation();
716+
var proxySubmitButton = document.getElementById('proxySubmitButton');
717+
proxySubmitButton.value = "saveDefaults";
718+
var form = document.getElementById('settingsForm');
719+
form.submit();
720+
}
721+
722+
document.getElementById('saveDefaults').addEventListener('click',submitForm,false);
723+
704724
function init() {
705725
disableActionButtons();
706726
var root = document.getElementById("namespaceTemp").value;

git-webui/release/share/git-webui/webui/js/git-webui.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,28 @@ webui.SideBarView = function(mainView, noEventHandlers) {
394394
}
395395
});
396396

397+
// Search bar to filter the results
398+
if (idPostfix =='popup') {
399+
var searchBar = $('<input type="text" id="search-input" placeholder="Filter..." style="width:100%">').appendTo(accordionDiv)[0];
400+
searchBar.onkeyup = function(){
401+
let branchCards = accordionDiv.getElementsByClassName("branch-card");
402+
403+
var filter = searchBar.value.toUpperCase().replaceAll('/', '-');
404+
405+
for (let i = 0; i < branchCards.length; i++) {
406+
let card = branchCards[i]
407+
let cardHeader = card.querySelector('.card-header');
408+
if (cardHeader) {
409+
if (cardHeader.id.toUpperCase().indexOf(filter) > -1) {
410+
card.style.display = '';
411+
} else {
412+
card.style.display = 'none';
413+
}
414+
}
415+
}
416+
};
417+
}
418+
397419
for (var i = 0; i < refs.length && i < maxRefsCount; ++i) {
398420
var ref = refs[i] + ""; // Get a copy of it
399421
if (ref[2] == '(' && ref[ref.length - 1] == ')') {
@@ -405,7 +427,7 @@ webui.SideBarView = function(mainView, noEventHandlers) {
405427
ref = ' ' + newref;
406428
}
407429
}
408-
var cardDiv = $('<div class="card custom-card">').appendTo(accordionDiv)[0];
430+
var cardDiv = $('<div class="card custom-card branch-card">').appendTo(accordionDiv)[0];
409431
if (id.indexOf("local-branches") > -1) {
410432
// parses the output of git branch --verbose --verbose
411433
var matches = /^\*?\s*([\w-.@&_\/]+)\s+([^\s]+)\s+(\[.*\])?.*/.exec(ref);

git-webui/src/share/git-webui/webui/js/git-webui.js

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -394,6 +394,28 @@ webui.SideBarView = function(mainView, noEventHandlers) {
394394
}
395395
});
396396

397+
// Search bar to filter the results
398+
if (idPostfix =='popup') {
399+
var searchBar = $('<input type="text" id="search-input" placeholder="Filter..." style="width:100%">').appendTo(accordionDiv)[0];
400+
searchBar.onkeyup = function(){
401+
let branchCards = accordionDiv.getElementsByClassName("branch-card");
402+
403+
var filter = searchBar.value.toUpperCase().replaceAll('/', '-');
404+
405+
for (let i = 0; i < branchCards.length; i++) {
406+
let card = branchCards[i]
407+
let cardHeader = card.querySelector('.card-header');
408+
if (cardHeader) {
409+
if (cardHeader.id.toUpperCase().indexOf(filter) > -1) {
410+
card.style.display = '';
411+
} else {
412+
card.style.display = 'none';
413+
}
414+
}
415+
}
416+
};
417+
}
418+
397419
for (var i = 0; i < refs.length && i < maxRefsCount; ++i) {
398420
var ref = refs[i] + ""; // Get a copy of it
399421
if (ref[2] == '(' && ref[ref.length - 1] == ')') {
@@ -405,7 +427,7 @@ webui.SideBarView = function(mainView, noEventHandlers) {
405427
ref = ' ' + newref;
406428
}
407429
}
408-
var cardDiv = $('<div class="card custom-card">').appendTo(accordionDiv)[0];
430+
var cardDiv = $('<div class="card custom-card branch-card">').appendTo(accordionDiv)[0];
409431
if (id.indexOf("local-branches") > -1) {
410432
// parses the output of git branch --verbose --verbose
411433
var matches = /^\*?\s*([\w-.@&_\/]+)\s+([^\s]+)\s+(\[.*\])?.*/.exec(ref);

0 commit comments

Comments
 (0)