Catalogue: wikidata suggestions
[redakcja.git] / src / catalogue / static / catalogue / wikidata_admin.js
diff --git a/src/catalogue/static/catalogue/wikidata_admin.js b/src/catalogue/static/catalogue/wikidata_admin.js
new file mode 100644 (file)
index 0000000..2ba5a1c
--- /dev/null
@@ -0,0 +1,61 @@
+(function($) {
+    $(function() {
+    
+        let model = $('body').attr('class').match(/model-([^\s]*)/)[1];
+        $("#id_wikidata").each(show_wikidata_hints).on('change', show_wikidata_hints);
+
+        function show_wikidata_hints() {
+            $(".wikidata-hint").remove();
+            $wdinput = $(this);
+            let qid = $wdinput.val();
+            $wdinput.addClass('wikidata-processing');
+            $.ajax(
+                '/catalogue/wikidata/' + model + '/' + qid,
+                {
+                    success: function(result) {
+                        for (att in result) {
+                            let val = result[att];
+                            let $input = $("#id_" + att);
+                            if (val && val != $input.val()) {
+                                let el = $('<span class="wikidata-hint">');
+                                if (val.wd) {
+                                    el.on('click', function() {
+                                        set_value_from_wikidata_id(
+                                            $input, val.model, val.wd,
+                                            function() {
+                                                $(this).remove();
+                                            }
+                                        );
+                                    });
+                                    el.text(val.label);
+                                } else {
+                                    el.on('click', function() {
+                                        $input.val(val);
+                                        $(this).remove();
+                                    });
+                                    el.text(val);
+                                }
+                                $input.parent().append(el);
+                            }
+                        };
+
+                        $wdinput.removeClass('wikidata-processing');
+                    },
+                }
+            );
+        }
+
+        function set_value_from_wikidata_id($input, model, wikidata_id, callback) {
+            $.post({
+                url: '/catalogue/wikidata/' + model + '/' + wikidata_id,
+                data: {
+                    csrfmiddlewaretoken: $('[name=csrfmiddlewaretoken]').val(),
+                },
+                success: function(result) {
+                    $input.val(result.id);
+                    callback();
+                },
+            })
+        }
+    });
+})(jQuery);