summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorYorhel <git@yorhel.nl>2022-08-21 17:15:11 +0200
committerYorhel <git@yorhel.nl>2022-08-21 17:15:11 +0200
commit0f2d0f3b1bd6e0ef43f268c3bb14a79a824e1e44 (patch)
treeeff793bba134f2329aff1f90bfd51aa11568c956 /lib
parent5eb3eaa7484ade5bfd4492af95de0a0d3dcc2c03 (diff)
UList: Add text input to create new label in label dropdown
Diffstat (limited to 'lib')
-rw-r--r--lib/VNWeb/Elm.pm1
-rw-r--r--lib/VNWeb/ULists/Elm.pm49
2 files changed, 41 insertions, 9 deletions
diff --git a/lib/VNWeb/Elm.pm b/lib/VNWeb/Elm.pm
index 08029680..82d2991f 100644
--- a/lib/VNWeb/Elm.pm
+++ b/lib/VNWeb/Elm.pm
@@ -54,6 +54,7 @@ our %apis = (
BadCurPass => [], # Current password is incorrect when changing password
MailChange => [], # A confirmation mail has been sent to change a user's email address
ImgFormat => [], # Unrecognized image format
+ LabelId => [{uint => 1}], # Label created
DupNames => [ { aoh => { # Duplicate names/aliases (for tags & traits)
id => { vndbid => ['i','g'] },
name => {},
diff --git a/lib/VNWeb/ULists/Elm.pm b/lib/VNWeb/ULists/Elm.pm
index 424176d4..17615183 100644
--- a/lib/VNWeb/ULists/Elm.pm
+++ b/lib/VNWeb/ULists/Elm.pm
@@ -11,6 +11,16 @@ sub updcache {
}
+sub sql_labelid {
+ my($uid) = @_;
+ sql '(SELECT min(x.n)
+ FROM generate_series(10,
+ greatest((SELECT max(id)+1 from ulist_labels ul WHERE ul.uid =', \$uid, '), 10)
+ ) x(n)
+ WHERE NOT EXISTS(SELECT 1 FROM ulist_labels ul WHERE ul.uid =', \$uid, 'AND ul.id = x.n))';
+}
+
+
our $LABELS = form_compile any => {
uid => { vndbid => 'u' },
labels => { aoh => {
@@ -28,15 +38,7 @@ elm_api UListManageLabels => undef, $LABELS, sub {
# Insert new labels
my @new = grep $_->{id} < 0 && !$_->{delete}, @$labels;
- # Subquery to get the lowest unused id
- my $newid = sql '(
- SELECT min(x.n)
- FROM generate_series(10,
- greatest((SELECT max(id)+1 from ulist_labels ul WHERE ul.uid =', \$uid, '), 10)
- ) x(n)
- WHERE NOT EXISTS(SELECT 1 FROM ulist_labels ul WHERE ul.uid =', \$uid, 'AND ul.id = x.n)
- )';
- tuwf->dbExeci('INSERT INTO ulist_labels', { id => $newid, uid => $uid, label => $_->{label}, private => $_->{private} }) for @new;
+ tuwf->dbExeci('INSERT INTO ulist_labels', { id => sql_labelid($uid), uid => $uid, label => $_->{label}, private => $_->{private} }) for @new;
# Update private flag
tuwf->dbExeci(
@@ -74,6 +76,35 @@ elm_api UListManageLabels => undef, $LABELS, sub {
};
+# Create a new label and add it to a VN
+elm_api UListLabelAdd => undef, {
+ uid => { vndbid => 'u' },
+ vid => { vndbid => 'v' },
+ label => { maxlength => 50 },
+}, sub {
+ my($data) = @_;
+ return elm_Unauth if !ulists_own $data->{uid};
+
+ my $id = tuwf->dbVali('
+ WITH x(id) AS (SELECT id FROM ulist_labels WHERE', { uid => $data->{uid}, label => $data->{label} }, '),
+ y(id) AS (INSERT INTO ulist_labels (id, uid, label, private) SELECT', sql_join(',',
+ sql_labelid($data->{uid}), \$data->{uid}, \$data->{label},
+ # Let's copy the private flag from the Voted label, seems like a sane default
+ sql('(SELECT private FROM ulist_labels WHERE', {uid => $data->{uid}, id => 7}, ')')
+ ), 'WHERE NOT EXISTS(SELECT 1 FROM x) RETURNING id)
+ SELECT id FROM x UNION SELECT id FROM y'
+ );
+ die "Attempt to set vote label" if $id == 7;
+
+ tuwf->dbExeci('INSERT INTO ulist_vns', {uid => $data->{uid}, vid => $data->{vid}}, 'ON CONFLICT (uid, vid) DO NOTHING');
+ tuwf->dbExeci(
+ 'INSERT INTO ulist_vns_labels', { uid => $data->{uid}, vid => $data->{vid}, lbl => $id },
+ 'ON CONFLICT (uid, vid, lbl) DO NOTHING'
+ );
+ updcache $data->{uid};
+ elm_LabelId $id
+};
+
our $VNVOTE = form_compile any => {