Item shares list on form

This commit is contained in:
roberto 2025-01-20 16:09:33 +01:00
parent 9413240165
commit f76f9e42d6
6 changed files with 64 additions and 59 deletions

View file

@ -192,21 +192,21 @@ function bm_type_field_undelete(sender, type_field_id) {
document.getElementById('Field-' + type_field_id).classList.remove('field-opaque'); document.getElementById('Field-' + type_field_id).classList.remove('field-opaque');
} }
function bm_item_relation_delete(sender, relation_name, relation_name_remove) { function bm_element_list_delete(sender, element_name, element_name_remove) {
document.getElementById(relation_name_remove).value = '1'; document.getElementById(element_name_remove).value = '1';
sender.hidden = true; sender.hidden = true;
document.getElementById('Undelete-' + relation_name).hidden = false; document.getElementById('Undelete-' + element_name).hidden = false;
var x = document.getElementsByClassName(relation_name + "-Col"); var x = document.getElementsByClassName(element_name + "-Col");
for (var i = 0; i < x.length; i++) { for (var i = 0; i < x.length; i++) {
x[i].classList.add("field-opaque"); x[i].classList.add("field-opaque");
} }
} }
function bm_item_relation_undelete(sender, relation_name, relation_name_remove) { function bm_element_list_undelete(sender, element_name, element_name_remove) {
document.getElementById(relation_name_remove).value = ''; document.getElementById(element_name_remove).value = '';
sender.hidden = true; sender.hidden = true;
document.getElementById('Delete-' + relation_name).hidden = false; document.getElementById('Delete-' + element_name).hidden = false;
var x = document.getElementsByClassName(relation_name + "-Col"); var x = document.getElementsByClassName(element_name + "-Col");
for (var i = 0; i < x.length; i++) { for (var i = 0; i < x.length; i++) {
x[i].classList.remove("field-opaque"); x[i].classList.remove("field-opaque");
} }

View file

@ -6,7 +6,7 @@
{{ end }} {{ end }}
{{ $shares_present := false }} {{ $shares_present := false }}
{{ if (gt (len (index .item.FieldsSection "fields")) 0) }} {{ if (gt (len .item.Shares) 0) }}
{{ $shares_present = true }} {{ $shares_present = true }}
{{ end }} {{ end }}
@ -18,7 +18,7 @@
<a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'fields')">Fields</a> <a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'fields')">Fields</a>
{{ end }} {{ end }}
<a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'relationsSection')">Relations</a> <a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'relationsSection')">Relations</a>
{{ if $fields_present }} {{ if $shares_present }}
<a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'sharesSection')">Shares</a> <a class="tab-button" onclick="bm_open_tab(this, 'tab-button', 'tab', 'sharesSection')">Shares</a>
{{ end }} {{ end }}
</div> </div>
@ -108,9 +108,9 @@
</div> </div>
{{ if $shares_present }} {{ if $shares_present }}
<div class="tab" id="shares" style="display: none"> <div class="tab" id="sharesSection" style="display: none">
<div id="shares"> <div id="shares">
{{ template "items:shares"}} {{ template "item:shares" .}}
</div> </div>
</div> </div>
{{ end }} {{ end }}

View file

@ -51,8 +51,8 @@
</td> </td>
<td class="no-label {{$relation_name}}-Col">{{ widget_relation_type $relation_name $relation_type `id="$relation_name"` }}</td> <td class="no-label {{$relation_name}}-Col">{{ widget_relation_type $relation_name $relation_type `id="$relation_name"` }}</td>
<td class="no-label"> <td class="no-label">
<button id="Delete-{{$relation_name}}" class="delete" type="button" onclick="bm_item_relation_delete(this, {{$relation_name}}, {{$relation_name_remove}})"><i class="bi bi-x-square" title="Remove"></i><span>Remove</span></button> <button id="Delete-{{$relation_name}}" class="delete" type="button" onclick="bm_element_list_delete(this, {{$relation_name}}, {{$relation_name_remove}})"><i class="bi bi-x-square" title="Remove"></i><span>Remove</span></button>
<button id="Undelete-{{$relation_name}}" style="margin-right: 5px;" class="delete" type="button" onclick="bm_item_relation_undelete(this, {{$relation_name}}, {{$relation_name_remove}})" hidden><i class="bi bi-arrow-counterclockwise" title="Undo"></i><span>Undo</span></button> <button id="Undelete-{{$relation_name}}" style="margin-right: 5px;" class="delete" type="button" onclick="bm_element_list_undelete(this, {{$relation_name}}, {{$relation_name_remove}})" hidden><i class="bi bi-arrow-counterclockwise" title="Undo"></i><span>Undo</span></button>
</td> </td>
</tr> </tr>
{{ end }} {{ end }}

View file

@ -2,57 +2,34 @@
<table class="table-all striped responsive"> <table class="table-all striped responsive">
<thead> <thead>
<tr> <tr>
<th>Item</th> <th>Token</th>
<th>Categories</th> <th>Edit</th>
<th>Tags</th> <th>State date time</th>
<th>Relation type</th> <th>End date time</th>
<th></th> <th></th>
</tr> </tr>
</thead> </thead>
<tbody id="shares-items"> <tbody id="shares-items">
{{ range .item.Relations}} {{ range .item.Shares}}
{{ $relation_name := printf "%s%v-%v" "ItemRelation-" .Item_id .Related_item_id }} {{ $share_name := printf "%s%v" "Share-" .Id }}
{{ $relation_name_remove := printf "%s%v-%v" "ItemRelation-ToRemove-" .Item_id .Related_item_id }} {{ $share_name_remove := printf "%s%v" "ItemShare-ToRemove-" .Id }}
<tr id="{{$relation_name}}-Row"> <tr id="{{$share_name}}-Row">
<td class="no-label {{$relation_name}}-Col"> <td class="no-label {{$share_name}}-Col">
{{ $target_id := .Related_item_id}} {{ .Token }}
{{ $relation_type := .Relation_type }} <input type="hidden" id="{{$share_name_remove}}" name="{{$share_name_remove}}" value=""/>
{{ if eq .Related_item_id $.item.Id }}
{{ $target_id = .Item_id}}
{{ if eq "Parent" .Relation_type}}
{{ $relation_type = "Child" }}
{{ else if eq "Child" .Relation_type}}
{{ $relation_type = "Parent" }}
{{ end }}
{{ end }}
<a href="/item/view/{{$target_id}}" hx-get="/item/view/{{$target_id}}" hx-target="body" hx-swap="beforeend"><i class="{{.Type_icon}}" title="{{.Type_title}}"></i> {{.Title}}</a>
<input type="hidden" id="{{$relation_name_remove}}" name="{{$relation_name_remove}}" value=""/>
</td> </td>
<td class="no-label {{$relation_name}}-Col"> <td class="no-label {{$share_name}}-Col">
{{ if gt (len .Categories) 0 }} {{ .PermissionEdit }}
<i class="hide-medium hide-large bi bi-tags-fill"></i>
{{ range (stringToArray .Categories "|")}}
{{ $category_name := index $.categoriesMap .}}
<div class="tag" style="padding: 3px">
{{ $category_name }}
</div>
{{ end }}
{{ end }}
</td> </td>
<td class="no-label {{$relation_name}}-Col"> <td class="no-label {{$share_name}}-Col">
{{ if gt (len .Tags) 0 }} {{ .StartDatetime }}
<i class="hide-medium hide-large bi bi-tags"></i> </td>
{{ range (stringToArray .Tags ",")}} <td class="no-label {{$share_name}}-Col">
<div class="tag" style="padding: 3px"> {{ .EndDatetime }}
{{ . }}
</div>
{{ end }}
{{ end }}
</td> </td>
<td class="no-label {{$relation_name}}-Col">{{ widget_relation_type $relation_name $relation_type `id="$relation_name"` }}</td>
<td class="no-label"> <td class="no-label">
<button id="Delete-{{$relation_name}}" class="delete" type="button" onclick="bm_item_relation_delete(this, {{$relation_name}}, {{$relation_name_remove}})"><i class="bi bi-x-square" title="Remove"></i><span>Remove</span></button> <button id="Delete-{{$share_name}}" class="delete" type="button" onclick="bm_element_list_delete(this, {{$share_name}}, {{$share_name_remove}})"><i class="bi bi-x-square" title="Remove"></i><span>Remove</span></button>
<button id="Undelete-{{$relation_name}}" style="margin-right: 5px;" class="delete" type="button" onclick="bm_item_relation_undelete(this, {{$relation_name}}, {{$relation_name_remove}})" hidden><i class="bi bi-arrow-counterclockwise" title="Undo"></i><span>Undo</span></button> <button id="Undelete-{{$share_name}}" style="margin-right: 5px;" class="delete" type="button" onclick="bm_element_list_undelete(this, {{$share_name}}, {{$share_name_remove}})" hidden><i class="bi bi-arrow-counterclockwise" title="Undo"></i><span>Undo</span></button>
</td> </td>
</tr> </tr>
{{ end }} {{ end }}

View file

@ -742,7 +742,7 @@ func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) {
if r.Header.Get("HX-Request") == "true" { if r.Header.Get("HX-Request") == "true" {
err := response.HXFragment(fullBuf, []string{"items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl"}, "page:content", data) err := response.HXFragment(fullBuf, []string{"items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl", "items/shares.tmpl"}, "page:content", data)
if err != nil { if err != nil {
app.serverError(w, r, err) app.serverError(w, r, err)
} }
@ -755,7 +755,7 @@ func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) {
w.Header().Add("HX-Trigger-After-Settle", `{"activateEasyMDE":"item-description"}`) w.Header().Add("HX-Trigger-After-Settle", `{"activateEasyMDE":"item-description"}`)
fullBuf.WriteTo(w) fullBuf.WriteTo(w)
} else { } else {
err := response.Page(w, http.StatusOK, data, []string{"items/update_title.tmpl", "items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl", "items/form_jscode.tmpl"}) err := response.Page(w, http.StatusOK, data, []string{"items/update_title.tmpl", "items/form.tmpl", "items/fields.tmpl", "items/relations.tmpl", "items/shares.tmpl", "items/form_jscode.tmpl"})
if err != nil { if err != nil {
app.serverError(w, r, err) app.serverError(w, r, err)
} }
@ -833,6 +833,14 @@ func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) {
itemModel.UpdateRelation(item_id, related_item_id, values[0]) itemModel.UpdateRelation(item_id, related_item_id, values[0])
} }
} }
shareId, found := strings.CutPrefix(name, "ItemShare-ToRemove-")
if found && len(values) > 0 {
valuesRemove, isMapContainsKey := r.PostForm["ItemShare-ToRemove-"+shareId]
if isMapContainsKey && valuesRemove[0] == "1" {
shareIdInt, _ := strconv.ParseInt(shareId, 10, 64)
itemModel.DeleteShare(shareIdInt)
}
}
} }
for type_field_id, values := range fieldsValues { for type_field_id, values := range fieldsValues {
@ -843,12 +851,14 @@ func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) {
itemModel.SaveKeywords(item, &fields, fieldsValues) itemModel.SaveKeywords(item, &fields, fieldsValues)
relations, _, _ := itemModel.GetRelations(item.Id) relations, _, _ := itemModel.GetRelations(item.Id)
shares, _, _ := itemModel.GetShares(item.Id)
data["item"] = itemForm{ data["item"] = itemForm{
Title: item.Title, Title: item.Title,
Type_icon: item.Type_icon, Type_icon: item.Type_icon,
Type_title: item.Type_title, Type_title: item.Type_title,
Relations: relations, Relations: relations,
Shares: shares,
} }
data["FieldsSection"] = fieldsSection data["FieldsSection"] = fieldsSection
@ -872,6 +882,11 @@ func (app *application) itemUpdate(w http.ResponseWriter, r *http.Request) {
app.serverError(w, r, err) app.serverError(w, r, err)
} }
err = response.HXFragmentOOB(fullBuf, []string{"items/shares.tmpl"}, "item:shares", data, "shares")
if err != nil {
app.serverError(w, r, err)
}
data["uisection"] = "general" data["uisection"] = "general"
err = response.HXFragmentOOB(fullBuf, []string{"items/fields.tmpl"}, "items:fields", data, "fields-general") err = response.HXFragmentOOB(fullBuf, []string{"items/fields.tmpl"}, "items:fields", data, "fields-general")
if err != nil { if err != nil {

View file

@ -444,6 +444,19 @@ func (model *ItemModel) DeleteRelation(id int64, related_id int64) error {
return nil return nil
} }
func (model *ItemModel) DeleteShare(shareId int64) error {
ctx, cancel := database.GetContext()
defer cancel()
query := `DELETE FROM bm_item_shares WHERE id=$1`
_, err := model.DB.ExecContext(ctx, query, shareId)
if err != nil {
return err
}
return nil
}
func (model *ItemModel) GetRelations(id int64) ([]ItemRelation, bool, error) { func (model *ItemModel) GetRelations(id int64) ([]ItemRelation, bool, error) {
ctx, cancel := database.GetContext() ctx, cancel := database.GetContext()
defer cancel() defer cancel()