From c20dcb3612de13eeb870de31d83e816d93bdc830 Mon Sep 17 00:00:00 2001 From: Jo-Philipp Wich Date: Tue, 16 Nov 2010 18:48:02 +0000 Subject: libs/web: add range(min,max) datatype validator --- libs/web/htdocs/luci-static/resources/cbi.js | 22 ++++++++++++++++++- libs/web/luasrc/cbi.lua | 33 ++++++++++++++++++++-------- libs/web/luasrc/cbi/datatypes.lua | 12 ++++++++++ 3 files changed, 57 insertions(+), 10 deletions(-) (limited to 'libs') diff --git a/libs/web/htdocs/luci-static/resources/cbi.js b/libs/web/htdocs/luci-static/resources/cbi.js index 8e2f62aea..059d27a1b 100644 --- a/libs/web/htdocs/luci-static/resources/cbi.js +++ b/libs/web/htdocs/luci-static/resources/cbi.js @@ -155,6 +155,18 @@ var cbi_validators = { 'uciname': function(v) { return (v.match(/^[a-zA-Z0-9_]+$/) != null); + }, + + 'range': function(v, args) + { + var min = parseInt(args[0]); + var max = parseInt(args[1]); + var val = parseInt(v); + + if (!isNaN(min) && !isNaN(max) && !isNaN(val)) + return ((val >= min) && (val <= max)); + + return false; } }; @@ -634,6 +646,14 @@ function cbi_validate_reset(form) function cbi_validate_field(cbid, optional, type) { var field = (typeof cbid == "string") ? document.getElementById(cbid) : cbid; + var vargs; + + if( type.match(/^(\w+)\(([^\(\)]+)\)/) ) + { + type = RegExp.$1; + vargs = RegExp.$2.split(/\s*,\s*/); + } + var vldcb = cbi_validators[type]; if( field && vldcb ) @@ -649,7 +669,7 @@ function cbi_validate_field(cbid, optional, type) var value = (field.options && field.options.selectedIndex > -1) ? field.options[field.options.selectedIndex].value : field.value; - if( !(((value.length == 0) && optional) || vldcb(value)) ) + if( !(((value.length == 0) && optional) || vldcb(value, vargs)) ) { // invalid field.className += ' cbi-input-invalid'; diff --git a/libs/web/luasrc/cbi.lua b/libs/web/luasrc/cbi.lua index 403935aec..6c9e7a544 100644 --- a/libs/web/luasrc/cbi.lua +++ b/libs/web/luasrc/cbi.lua @@ -1358,20 +1358,35 @@ end -- Validate the form value function AbstractValue.validate(self, value) - if self.datatype and value and datatypes[self.datatype] then - if type(value) == "table" then - local v - for _, v in ipairs(value) do - if v and #v > 0 and not datatypes[self.datatype](v) then - return nil - end + if self.datatype and value then + local args = { } + local dt, ar = self.datatype:match("^(%w+)%(([^%(%)]+)%)") + + if dt and ar then + local a + for a in ar:gmatch("[^%s,]+") do + args[#args+1] = a end else - if not datatypes[self.datatype](value) then - return nil + dt = self.datatype + end + + if dt and datatypes[dt] then + if type(value) == "table" then + local v + for _, v in ipairs(value) do + if v and #v > 0 and not datatypes[dt](v, unpack(args)) then + return nil + end + end + else + if not datatypes[dt](value, unpack(args)) then + return nil + end end end end + return value end diff --git a/libs/web/luasrc/cbi/datatypes.lua b/libs/web/luasrc/cbi/datatypes.lua index f8d815377..2fdb5802c 100644 --- a/libs/web/luasrc/cbi/datatypes.lua +++ b/libs/web/luasrc/cbi/datatypes.lua @@ -208,3 +208,15 @@ end function uciname(val) return (val:match("^[a-zA-Z0-9_]+$") ~= nil) end + +function range(val, min, max) + val = tonumber(val) + min = tonumber(min) + max = tonumber(max) + + if val ~= nil and min ~= nil and max ~= nil then + return ((val >= min) and (val <= max)) + end + + return false +end -- cgit v1.2.3